java 线程 (二) 线程池

时间:2023-12-17 11:55:08
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";
} }