liuyuze_hanbing 发表于 2017-9-27 11:33:43

java线程和线程池

一、Thread介绍
线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting(睡眠或等待一定的事件)、waiting(等待被唤醒)、消亡(dead)。


join() 等待至线程执行结束
sleep() 线程主动睡眠,不会释放锁
wait() 线程休眠,释放锁
yield()线程交出cpu使用权,不会占用一个完成的cpu执行周期
interrupt()发送终止标记
isInterrupted() 判断线程是否有终止标记
Thread.interrupted() 判断是否存在终止标记同时清除终止标记
1.除非当前线程正在中断自身,这是始终允许的,所以调用此线程的checkAccess方法,这可能会导致抛出SecurityException异常。

2.如果在调用wait(),wait(long)或wait(long,int)对象类或join(),join(long),join(long,int)的方法中阻塞此线程, ,sleep(long)或sleep(long,int),这个类的方法,那么它的中断状态将被清除,它会收到一个InterruptedException。
3.如果此线程在InterruptibleChannel上的I / O操作中被阻塞,则通道将被关闭,线程的中断状态将被设置,线程将接收到java.nio.channels.ClosedByInterruptException。
4.如果此线程在java.nio.channels.Selector中被阻止,那么线程的中断状态将被设置,并且它将从选择操作立即返回,可能具有非零值,就好像选择器的唤醒方法被调用一样。
5.如果线程正在执行,只是收到终止信号,如果要终止正在执行的线程,可以通过判断isInterrupted()来手动终止线程,一般不这么用。使用一个isStop状态量来控制

二、创建线程Thread
1、无返回值
      new Thread() {
            @Override
            public void run() {
            }
      }.start();

      new Thread(new Runnable(){
            @Override
            public void run() {
            }
      }).start();

2、有返回值
      Callable<String> mycallable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                return null;
            }
      };
      FutureTask<String> futureTask = new FutureTask<String>(mycallable) {
            @Override
            protected void done() {
                // 执行结束时调用该方法
                super.done();
            }
      };
      new Thread(futureTask).start();

三、Future
public interface Future<V>

public class FutureTask<V> implements RunnableFuture<V>

protected void done(),当任务结束时,该回调函数会被触发,必要时重写该方法

public boolean cancel(mayInterruptIfRunning) 尝试取消任务
1. 如果任务已经完成、已经被取消、由于某种其他原因而无法取消,则此尝试将失败。

2.如果任务尚未启动并且尝试取消成功,则此任务不在被执行。

3.如果任务正在运行,mayInterruptIfRunning参数确定是否调用thread.interrupt();
四、ExecutorService 使用

[*]ExecutorService executorService1 = Executors.newSingleThreadExecutor();//单个线程的线程池Executors$FinalizableDelegatedExecutorService内部还是ThreadPoolExecutor
[*]ExecutorService executorService2 = Executors.newFixedThreadPool(10);//固定大小的线程池ThreadPoolExecutor
[*]ExecutorService executorService3 = Executors.newScheduledThreadPool(10);//定时执行的线程池 ScheduledThreadPoolExecutor
[*]ExecutorService executorService4 = Executors.newCachedThreadPool(); //可变大小的线程池ThreadPoolExecutor //最小0 最大Integer.MAX
[*]ExecutorService executorService4 = Executors.newWorkStealingPool(); // ForkJoinPool分叉合并

执行

[*]execute(Runnable)//无返回
[*]submit(Runnable)//返回Future
[*]submit(Callable<T>)//有返回Future<T>
[*]invokeAny(...) 阻塞,返回结果T,其中一个执行结束就返回
[*]invokeAll(...)有返回List<Future<T>>

关闭shutdown();阻止新来的任务提交,对已经提交了的任务不会产生任何影响。当已经提交的任务执行完后,它会将那些闲置的线程(idleWorks)进行中断,这个过程是异步的。无返回
shutdownNow()除了努力尝试停止处理积极执行任务之外,没有任何保证。 例如,典型的实现将通过Thread.interrupt取消,所以任何不能响应中断的任务可能永远不会终止。返回任务列表





页: [1]
查看完整版本: java线程和线程池