Thread和Runnable区别
Thread是线程,线程不做具体事情,线程是是驱动任务的执行
Runnable是任务,是执行具体事情的代码。由线程来驱动
任务是附着在线程上,线程驱动附着他的任务
一般我们如果想定义一个独立运行的任务
1:定义一个任务 --》只需实现Runnable接口的run方法
2:定义一个线程对象 --》
3.将任务附着于该对象 --》 Thead t = new Thread(实现了Runnable的对象)
4.启动线程,线程就会驱动附着于他的任务 --》t.start()
Executor
J2SE5添加了一个执行器 Executor
Executor.newCachedThreadPool()等等方法
Interrupt()方法理解
1.Interrupt()设置中断标志位为中断。
1.1如果此时线程要进入阻塞(入执行sleep()),那么将发生中断异常
1.2如果此时线程正在阻塞中(正在sleep()中),那么将发生中断异常
除了以上两种情况,线程将不会中断,而是继续正常执行
此时可以利用Thread.interrupted()判断是否中断而离开run()
sleep()理解
1.sleep()只能对当前线程有效,一个线程A正在执行,不能有另一个线程B调用A线程的sleep()来使得A线程进入睡眠。如果A线程这个时候并不是在执行,那么请问如何使其进入睡眠呢。所以只能有A线程自己调用sleep()来进入睡眠。
中断其他线程的理解
如果线程正在阻塞,也不一定都能使其中断,不能中断正在试图获取synchronized锁或者试图执行I/O操作的线程
Thread的重要方法理解
sleep()进入阻塞,但是不释放锁
yield()进入就绪状态,不释放锁
interrupt()设置中断标志位为中断,如果此时线程试图进入阻塞(如执行sleep())或者正在执行阻塞操作(如正在sleep()),那么将将产生中断异常
t.interrupt() t.isInterrupted() Thread.interrupted()区别
1.t.interrupt()设置中断标志位,是实例的方法,线程A持有线程B的句柄,那么线程A可以调用线程B的interrupt(),线程A也可以设置自己的线程为中断状态
2.t.isInterrupted() 判断线程t的中断标志位。如果已经中断返回true,如果未中断,返回false,并且不会恢复为false。作为实例的方法是因为线程A可以去获取线程B的中断状态,但是只能读取,却不能也不应该去把线程B中断标志位复位。
假设线程已经被中断,调用该方法也不一定总是返回true,如果已经发生中断异常,那么中断标志位将被复位,如果调用过Thread.interrupted(),那么中断标志位将被复位
public boolean isInterrupted() {
return isInterrupted(false);
}
3.Thread.interrupted(),返回当前线程的中断标志状态,并且复位。看jdk代码得知
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
join理解
等待另一线程结束才开始执行本线程。可以理解为在本线程的执行序列中插入另一个线程,只能等待另一个线程执行结束才能继续执行本线程了
可以参考这篇文章:http://uule.iteye.com/blog/1101994
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);//如果main中调用了t.join(),那么详单与在main线程中调用了wait(0),那么main线程将挂起。至于这个时候是否cpu会交给t,那就未必,当时main会等待 // t执行结束才开始执行
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}