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"; } }