java 线程 (二) 线程池

 

package cn.sasa.demo2;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {
    public static void main(String[] args) {
        /**
         * 线程状态
         * Thread.State
         * 
         * NEW
         * 至今尚未启动 new ...()
         * 
         * RUNNABLE
         * 正在执行 start()
         * 
         * BLOCKED
         * 受阻塞 并 等待某个监视器锁
         * 
         * WAITING
         * 无限期等待另一个线程来执行某一特定操作的线程 
         * wait() 等待 notify()唤醒 
         * 
         * TIMED_WAITING
         * 等待另一线程来执行,有等待时限 休眠 sleep()
         * 
         * TERMINATED
         * 已退出---- run()结束  /  stop() 已过时
         * 
         * 受阻塞:线程具有CPU的执行资格,等CPU的资源
         * 休眠等待:线程放弃CPU的执行资格
         * 
         * 线程池
         * 从jdk5之后内置线程池
         * 
         * 1、使用工厂类Executors 中的静态方法创建线程对象,指定线程的个数
         * 2、调用newFixedThreadPool 返回线程池对象 ExecutorService
         * 
         */
        ExecutorService es = Executors.newFixedThreadPool(2);
        es.submit(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + "...hello");
            }
        });
        
        es.submit(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + "...abc");
            }
        });
        
        es.submit(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + "...hahaha");
            }
        });
        
        //shutdown 销毁线程池,不常用,因为建立线程池就是为了线程不被销毁
        //es.shutdown();
        
        for(int i=0; i<100; i++) {
            System.out.println(i);
        }
    }
}

 

创建线程的第三种方式:实现Callable接口,传入线程池

实现Callable接口中的call方法,可以有返回值,可以抛异常

package cn.sasa.demo3;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Test {
    public static void main(String[] args) {
        //创建线程的第三种方式:实现Callable接口 传入线程池
        //Callable 可以有返回值,可以抛异常
        ExecutorService es = Executors.newFixedThreadPool(2);
        Future<String> strf = es.submit(new MyCallable());
        try {
            System.out.println(strf.get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

package cn.sasa.demo3;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {

    @Override
    public String call() throws Exception {
        return "ho ho ho";
    }

}

 

posted @ 2018-12-27 15:28  SasaL  Views(116)  Comments(0Edit  收藏  举报