欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
一、先说明启动线程的两种方式:
 
1、 继承Thread,重载run方法,执行start方法
 
Class MyThread extends Thread{
 
      @Override
 
           Void run(){
 
}
 
}
 
new MyThread().start();
 
2、 实现Runnable接口
 
Class MyTask implements Runnable {
 
      Void run(){}          
 
}
 
new Thread( new MyTask()).start();
 
这里顺便说下 new MyThread().start()和new MyThread().run();执行的区别,前者会启动一个线程执行run方法,后者是在本线程中执行run方法
 
二、再明确几个概念:
 
Callable接口和Runnable接口一样,也可通过实现该接口启动线程,但是Callable接口的run方法有返回值。
 
Future接口,相当于是对Callable进行了封装:
 
public interface Future {
 
    boolean cancel(boolean mayInterruptIfRunning);
 
    boolean isCancelled();
 
    boolean isDone();
 
    V get() throws InterruptedException, ExecutionException;
 
    V get(long timeout, TimeUnit unit)
 
        throws InterruptedException, ExecutionException, TimeoutException;
 
}
 
FutureTask是Future的一个实现,使用实例:
 
FutureTask futureTask = new FutureTask(new Callable(){});
 
new Thread(futureTask).start();  
 
MyResult  r = futureTask.get();
 
执行start方法后会执行Callable的run方法
 
调用futureTask 的get方法会执行,并判断是否执行完,如果run执行完了直接返回结果,否则的话会awaitDone阻塞,当start方法中的Callable方法执行完后会判断有没有阻塞的线程有的话会唤醒(LockSupport.parkNanos阻塞,LockSupport.unpark(thread)唤醒);注意当有多个线程阻塞的时候,是以链表形式存储的,唤醒的时候也是依次唤醒

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h63215.shtml