黑马程序员--java 知识回顾--多线程

来源:互联网 发布:天猫美工招聘 编辑:程序博客网 时间:2024/05/16 19:37

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


线程间通信:

        两个线程操作同一份数据;

        两个线程对数据的操作不一样。


例:




运行该程序,结果为:



结果杂乱无章,分析一下:

线程2在执行System.out.println(r.name+"......"+r.sex); 时 ,线程1也在不断地执行,线程1把r.name设置为张三,把r.sex设置为女。线程2打印了当前Resource对象的name后,还没执行完打印,执行权被线程1夺走,线程1执行i++后把r.name设置为Jack,把r.sex设置为Femail。此时执行权又被线程2抢走,线程2接着执行打印,此时打印的r.sex就是Femail。

显然,这是没有进行同步导致的,所以要进行同步。


线程同步有两个条件:

1.有两个或两个以上线程

2.使用同一个锁


这里已经是多线程了,所以还要满足第二个条件,使用同一个锁。

同步的代码块是操作同一份数据的代码。

在synchronized()的参数表中,参数可以是任意一个对象,随便用哪个对象都行。同步时要用同一个锁,所以参数必须是同一个对象。








notify唤醒线程池中排在最前面的睡眠线程。并且只能唤醒使用同一个锁的线程。


当线程进入冻结状态,即线程持有锁,但不执行,可使用interrupt方法终止线程。


join方法强夺执行权:

当一个线程对象调用join方法后,会把执行权从正在占有者那里强夺过来,并一直执行到该线程结束才放掉执行权。

多用于需要临时加入一个线程,并需将其执行完。


线程的默认优先级是5。

可以自己设置线程的优先级:setPriority(n);



sleep(time),wait(),yield()的区别。

sleep(time):让线程睡眠,不释放执行权。带参数,表示睡眠时间,到时间后自动唤醒。

wait():让线程睡眠,释放执行权,进入线程池。必须通过notify唤醒。

yield();让线程放弃执行权,该方法不需要notify唤醒,只是临时放弃执行权。让该线程执行的频率小一点。



在游戏开发中,线程的使用是很频繁而且很重要的。所以掌握线程的各种作用及用法还是很重要的。



---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

   详细请查看 www.itheima.com


0 0