分享

java线程和线程池

liuyuze_hanbing 发表于 2017-9-27 11:33:43 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 6139
一、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取消,所以任何不能响应中断的任务可能永远不会终止。返回任务列表





没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条