Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1661561
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: Java

2018-01-30 10:53:40

一、先说明启动线程的两种方式:

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;

}

FutureTaskFuture的一个实现,使用实例:

FutureTask futureTask = new FutureTask(new Callable(){});

new Thread(futureTask).start();  

MyResult  r = futureTask.get();

执行start方法后会执行Callablerun方法

调用futureTask get方法会执行,并判断是否执行完,如果run执行完了直接返回结果,否则的话会awaitDone阻塞,当start方法中的Callable方法执行完后会判断有没有阻塞的线程有的话会唤醒(LockSupport.parkNanos阻塞,LockSupport.unpark(thread)唤醒);注意当有多个线程阻塞的时候,是以链表形式存储的,唤醒的时候也是依次唤醒

参考:
https://www.cnblogs.com/cz123/p/7693064.html#top
http://blog.csdn.net/javazejian/article/details/50896505

阅读(81936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~