-
thread.start() 和 thread.run() 的区别
thread.start()方法通知“线程规划器”。就是让系统安排一个时间来调用thread中的run()
直接用thread.run() 就不是异步的了,而是同步的,是直接由main线程调用的。线程对象不交个“线程规划器”,
必须等run()执行完了,后面的程序才能执行。 -
//线程共享数据
MyThreadDataSelf myThreadDataSelf = new MyThreadDataSelf(“线程”);
Thread a = new Thread(myThreadDataSelf, “A”);
Thread b = new Thread(myThreadDataSelf, “B”);
Thread c = new Thread(myThreadDataSelf, “C”);
Thread d = new Thread(myThreadDataSelf, “D”);a.start();
b.start();
c.start();
d.start(); -
留意i-- 与println() 联合用时引发线程安全问题 println( …(i–) ).虽然println方法内部是同步的,
但i–的操作却是在进入println() 之前发生的,所以有发生非安全问题的概率。 -
Thread.currentThread().getName() 代码段正在被哪个线程调用
xxThread.isAlive() 判断当前线程是否处于活动状态
Thread.sleep() 休息一下
xxThread.getId() 取得线程的唯一标识 -
停止线程的方式
a, run()执行完,正常停止
b, stop()强行停止,和suspend()和resume()一样,不推荐使用,可能会有不可预料的后果
强制停止可能导致一些清理工作得不到完成,或者对锁定的对象进行了解锁,导致数据
得不到同步处理,出现数据不一致的问题。
c, interrupt,但这个方法不能终止一个正在运行的线程,还需要加一个条件。
this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能。
this.isinterrupted(): 测试线程Thread对象是否已经是中断状态,但是不能清除标志
d, 异常法 if(this.interrupted) {…; break}.但这依然有问题,如果for循环下面还有语句,还是会执行。
e, 改进不在break;直接抛异常 if(this.interrupted) {…; throw new InterruptedException} -
线程的挂起suspen()和恢复resume()
这两个方法有缺点
—独占。如果使用不当,极容易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。
(这个没看懂—主要是赖)
—不同步。 -
yield()方法:放弃当前的cpu资源, 将它让给其他任务去占用cpu执行时间,但是放弃的时间不确定,
有可能马上放弃,马上又获得CPU时间片。 -
线程的优先级
设置优先级有组于帮助“线程规划器”确定下一次选择哪一个线程来优先执行。
setPriority();
JDK线程优先级分为1到10,不在这个范围就抛异常。JDK使用3个常量来预设置定义优先级的值1, 5, 10;
高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部执行完。
也就是说,优先级和执行顺序有一定关系,但不能决定。 CPU决策的过程是非常复杂的。 -
守护线程
java线程分两种:用户线程, 守护线程(daemon)
只要还有一个用户线程在,那守护线程就一定在。用户线程一个都没有了,那守护线程自动销毁,
最典型的就是垃圾回收线程, 最典型的应用就是垃圾回收器。
第一章:多线程---基本API
最新推荐文章于 2020-04-14 17:03:08 发布