java 学习笔记4
(1) 线程的强制运行
先看线程强制运行的实例 ,再解释程序中是如何让程序强制运行的
public class ThreadTest1 implementsRunnable {
publicvoid run()
{
int i = 0;
for (int x = 0; x < 10; x++)
{
System.out.println(Thread.currentThread().getName()+"--->>"+i++);
}
}
}
public class threadjoin {
publicstatic void main(String[] args) {
ThreadTest1 t= new ThreadTest1();
Thread pp = new Thread(t);
pp.start();
int i=0;
for(int x =0;x<10;x++)
{
if(i == 5)
{
try
{
pp.join();
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
System.out.println("main Thread"+ i++ );
}
}
}
在程序启动了两个线程,一个是main()线程,一个是 pp 线程。
程序第 15 行,调用 pp 线程对象的 join()方法,在程序的输出结果中可以发现,调
用 join()方法之后,只有 pp 的线程对象在运行,也就是说,join()方法用来强制某
一线程运行。
由此例可知:由上可见,pp 线程中的代码被并入到了 main 线程中,也就是 pp 线程中的代码不
执行完,main 线程中的代码就只能一直等待。查看 JDK 文档可以发现,除了有无参
数的 join 方法外,还有两个带参数的 join 方法,分别是 join(long millis)和 join(long
millis,int nanos),它们的作用是指定合并时间,前者精确到毫秒,后者精确到纳秒,
意思是两个线程合并指定的时间后,又开始分离,回到合并前的状态。
(2) 多线程的同步
同步代码块定义语法
synchronized(对象)
{
需要同步的代码 ;
}
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
注意要点:
1) 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
2) 当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
3) 当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
4) 当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
线程同步代码实例:
public class withdra {
private int totalMoney = 0;
public synchronized void getmoney(int money){
synchronized(this)
{
System.out.println("正在执行getmoney()方法!");
int restmoney = totalMoney;
restmoney -= money;
try{
Thread.sleep(1000);
}catch (InterruptedException e)
{
e.printStackTrace();
}
totalMoney =restmoney;
System.out.println(Thread.currentThread().getName()+"提取1000元后的余额为:"+totalMoney);
}
}
public void setMoney()
{
this.totalMoney=9999;
System.out.println(Thread.currentThread().getName()+"把存款设置为:"+totalMoney);
}
publicwithdra(int totalmoney) {
this.totalMoney =totalmoney;
} }
public class FirThread implements Runnable{
privatewithdra wd; publicvoid run() {
wd.getmoney(1000);
}
publicFirThread(withdra wd)
{ this.wd = wd ;}
}
public class secThread implements Runnable{ privatewithdra wd; publicvoid run() {
wd.setMoney();
}
publicsecThread(withdra wd)
{ this.wd = wd ;} } public class TestSyn {
publicstatic void main(String[] args) {
withdrawd = new withdra(4000);
System.out.println("现在的存款为4000");
FirThreadft = new FirThread(wd);
secThreadst = new secThread(wd);
Threadth1 = new Thread(ft,"th1");
Threadth2 = new Thread(ft,"th2");
th1.start();
try{
Thread.sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
th2.start(); } }
java 学习笔记4的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
随机推荐
- 文件操作 系统备份和还原,压缩,解压 tar dump/restore
基本操作命令: ls -a 显示指定目录下的目录和文件,包括隐藏的文件和目录 ls -l 将文件和目录详细列出来,包括文件状态,权限,拥有者,文件名,文件大小等 改变工作目录命令 cd cd .. 进 ...
- window.onresize 多次触发的解决方法
用了window.onresize但是发现每次 onresize 后页面中状态总是不对,下面与大家分享下onresize 事件多次触发的解决方法. 之前做一个扩展,需要在改变窗口大小的时候保证页面显示 ...
- validate插件的使用
方法如下: 插件: jquery.validate.js jquery.validate.custom.js bootstrap html代码: <form id="form_name ...
- C#语言特性-运算符重载
一.C#当中可以进行重载和不可重载的运算符: 1.简单的说明: 1.从上图中可以看到,可以重载的和不可以进行重载的运算符,比较特殊的是第二行和倒数第三行,的运算符,为什么会说它们特殊,是因为(第三行) ...
- appium的安装过程(图文界面)
资料来源:http://www.cnblogs.com/fnng/p/4560298.html 1.准备安装材料
- 简洁代码---python---string
判断字符串是否是回文的,即是否中心对称的: >>>return s[::-1] == s 对称返回True, 否则返回False
- UIApplication 常用方法
下面是这个类的一些功能:1.设置icon上的数字图标 //设置主界面icon上的数字图标,在2.0中引进, 缺省为0 [UIApplicationsharedApplication].applicat ...
- hibernate的formula如何使用
之前用过hibernate的formula记得很好用,但是这次用到想不起来怎么用了,结果去网上查结果发现大多都是无用信息. 最终搞定了,还是在这里记录一下,省的忘记. 我用formula的目的在于字典 ...
- ORACLE 常用系统函数
1. 字符类 1.1 ASCII(c ) 函数 和CHR( i ) ASCII 返回一个字符的ASCii码,其中c表示一个字符;CHR 返回ascii码值i 所对应的字符 . 如: S ...
- bzoj 1815: [Shoi2006]color 有色图 置换群
1815: [Shoi2006]color 有色图 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 136 Solved: 50[Submit][Stat ...