线程知识小集合

线程知识小集合

1、停止线程
(1)run方法结束,开启多线程运行,运行代码通常是循环体,只要控制住循环,就可以让run方法结束,也就是结束线程。
(2)特殊情况:当线程属于冻结状态,就不会读取循环控制标记,则线程就不会结束。

为解决该特殊情况,可引入Thread类中的Interrupt方法结束线程的冻结状态
当没有指定的方式让冻结线程恢复到运行状态时,需要对冻结进行清除,强制让线程恢复到运行状态

2、interrupt

void interrupt() 中断线程: 
		清除中断状态,出现InterruptedException

3、守护线程(后台线程)
(1)setDaemon(boolean on): 标记为守护线程或者用户线程。
(2)当正在运行的线程都是守护线程时,java虚拟机jvm退出, 守护线程必须在启动线程前调用;
(3)守护线程的特点:

  • 守护线程开启后和前台线程共同抢夺cpu的执行权
  • 开启、运行两者都没区别
  • 结束时有区别,当所有前台线程都结束后,守护线程会自动结束。

4、多线程join方法
(1)void join() 等待该线程终止。
(2)void join(long millis) 等待该线程终止的时间最长为 millis 毫秒。
(3)throws InterruptedException
(4)特点:当A线程执行到B线程的join方法时,A就会等待B线程都执行完才会执行
(5)作用: join可以用来临时加入线程执行

5、多线程优先级:yield()方法
(1)yield():暂停当前正在执行的线程对象,并执行其他线程
(2)setPriority(int newPriority):更改线程优先级
(3)int getPriority() 返回线程的优先级。
(3)String toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组(4)
(4)优先级

MAX_PRIORITY:最高优先级(10)
Min_PRIORITY:最低优先级(1)
Morm_PRIORITY:默认优先级(5)

6、ThreadLocal类
(1)ThreadLocal类提供了线程局部 (thread-local) 变量, 是一个线程级别的局部变量,并非“本地线程”。
(2)ThreadLocal 为每个使用该变量的线程,提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本
(3)线程局部变量(ThreadLocal variables)的关键点:

  • 一个线程局部变量(ThreadLocal variables)为每个线程方便地提供了一个单独的变量。
  • ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程
  • 当多个线程访问ThreadLocal 实例时,每个线程维护 ThreadLocal 提供的独立的变量副本
  • 常用的使用可在 DAO 模式中见到,当DAO 类作为一个单例类时,数据库链接(connection)被每一个线程独立的维护,互不影响(基于线程的单例)

7、InvalidMonitorStateException异常
调用 wait ()/notify ()/notifyAll ()中的任何一个方法时,如果当前线程没有获得该对象的锁,就会抛出 IllegalMonitorStateException 的异常

8、在静态方法上使用同步时的问题

同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,
线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。 它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。

9、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?
(1)可以,一个非同步方法总是可以被调用而不会有任何问题。
(2)实际上,Java 没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。
(3)如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全,一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。

10、在一个对象上两个线程可以调用两个不同的同步实例方法吗?
不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁, 只有执行完该方法释放对象锁后才能执行其它同步方法。

11、线程饿死与活锁
(1)当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。
(2)JavaAPI 中线程活锁可能发生在以下情形:

当所有线程在程序中执行 Object.wait (0),参数为 0 的 wait 方法。
程序将发生活锁直到在相应的对象上有线程调用
Object.notify ()或者 Object.notifyAll ()。 当所有线程卡在无限循环中。

posted @ 2020-03-15 21:48  李泽坤  阅读(93)  评论(0编辑  收藏  举报