java线程总结

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;
            }
        }
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值