线程间通信:
两个线程操作同一份数据;
两个线程对数据的操作不一样。
例:
运行该程序,结果为:
结果杂乱无章,分析一下:
线程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唤醒,只是临时放弃执行权。让该线程执行的频率小一点。
在游戏开发中,线程的使用是很频繁而且很重要的。所以掌握线程的各种作用及用法还是很重要的。