线程的学习
使用线程
1.实现Runnable接口
2.继承Thread类
相同点
overwrite run方法,并且要public void
不同点
两种方法创建线程实例的时候
1.class t1 implements Runnable(){
.
.
.
}
2.class t2 extends Thread(){
.
.
.
}
Thread th1=new Thread(t1);
Thread th1=new t2();
th1.start();
th2.start();
Thread类的方法
.sleep(1000);//当前线程休眠1秒
..yield();//放弃此次cpu分配的时间片(我的理解是,"降低一次"当前线程优先级)
Thread 对象的方法
.start();//开启本线程
.run();//是start()的回调函数,会在start()时运行.
join()//获取th1线程的完成状况(等待th1执行完毕,使用此方法能更效率的管理各线程的运行顺序);
//多cpu的话,各线程会并发运行,所以有可能执行顺序被打乱.(没有环境,无法测试th1.join();,猜测是能够等待th1运行完毕,因为如果th2.start()需要th1的运行结果,在多cpu环境中,就可能抛异常)
join()方法例子
th1.start();
th1.join();
th2.start();
Thread.yieid();//因为当前线程的优先级大于子线程th2的优先级,所以syso会在th1执行后执行,调用
//当前线程的yieid()能够放弃此次cpu分配的执行机会,让th2.start()先执行
syso("当前线程正在执行..");
对线程的互斥控制,共享互斥(mutual exclusion)
//我的理解是,对与公共的资源,通过控制,一个线程使用开始时就吧这个资源加锁,这样其他线程就不能再访问此资源,这样有效的避免了两个售票员卖出2张同样的车票问题
调用synchornized(object o)
方法能够把o上锁,
(也可以在属性或方法,类上声明synchornized)
wart() notify/notifyAll
例子:
class synchornizd test(){
if(x<100){
wait([1000]);
}
}
wait的参数是等待时间
线程a,b来到test,
a获取了线程锁的钥匙,进入方法体
发现x<100.
执行wait()//进入休息室,并且吧线程锁钥匙扔出去
b又获得了线程锁钥匙,
进入test.同样x<100.也进入休息室
a,b在等待1秒后自动释放,或者等待其他线程调用notify[All]来释放休息室中的线程
注意:
if(x<100)
其实是不安全的,
因为如果a,b都在休息室,
c来了.把x改为了100,
a的休息时间完了,然后离开休息室,并且吧x改为了99,
b的休息时间也完了,他不进行判断就直接离开休息室,
采用while(x<100)
就不会发生这样的情况,
这样b想离开的时候,会再次比对一下条件,这样他就要继续在休息室呆着了.
在baidu文科上找的资料,看到这里突然没有了!!!!!!!!!!