Java笔记-多线程之线程池

介绍


在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:

程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。

线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。

在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池


Executor工厂类


JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法:

1.public static ExecutorService newCachedThreadPool()
创建一个具有缓存功能的线程池。

2.public static ExecutorService newFixedThreadPool(int nThreads)
创建一个可重用的,具有固定线程数的线程池。

3.public static ExecutorService newSingleThreadExecutor()
创建一个只有单线程的线程池,相当于上个方法(newFixedThreadPool)的参数nThreads等于1。

这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法:

1.Future submit(Runnable task)

2. Future submit(Callable task)


Thread子类线程池代码演示

public class Test {
	public static void main(String[] args) {
		ExecutorService pool = Executors.newFixedThreadPool(2);
		pool.submit(new MyTh("貂蝉"));
		pool.submit(new MyTh("大乔"));
		pool.submit(new MyTh("小乔"));
		pool.submit(new MyTh("黄月英"));
		pool.submit(new MyTh("孙尚香"));
		//线程池不是线程执行结束就终止,而是必须手动终止!
		pool.shutdown();
	}
}

class MyTh extends Thread {
	int num = 0;

	public MyTh(String name) {
		super(name);
	}

	@Override
	public void run() {
		while (num < 50) {
			try {
				sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(getName() + "--->" + (num++));
		}
	}
}

Runnable接口线程池代码演示

public class Test {
	public static void main(String[] args) {
		ExecutorService pool = Executors.newFixedThreadPool(2);
		pool.submit(new MyTh());
		pool.submit(new MyTh());
		pool.submit(new MyTh());
		pool.submit(new MyTh());
		pool.submit(new MyTh());
		// 线程池不是线程执行结束就终止,而是必须手动终止!
		pool.shutdown();
	}
}

class MyTh implements Runnable {
	int num = 0;

	@Override
	public void run() {
		while (num < 50) {
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "--->" + (num++));
		}
	}
}

Callable接口线程池代码演示

是一个子线程,但是不能直接运行,只能在线程池中使用!

public class Test {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ExecutorService pool = Executors.newFixedThreadPool(2);
		Future<String> s1 = pool.submit(new MyTh());
		Future<String> s2 = pool.submit(new MyTh());
		Future<String> s3 = pool.submit(new MyTh());
		// 线程池不是线程执行结束就终止,而是必须手动终止!
		pool.shutdown();
		// Future对象只能通过get()方法获取到值
		System.out.println(s1.get());
		System.out.println(s2.get());
		System.out.println(s3.get());
	}
}

class MyTh implements Callable<String> {
	int num = 0;

	@Override
	public String call() throws Exception {
		while (num < 50) {
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "--->" + (num++));
		}
		return "Callable运行结束";
	}
}

你可能感兴趣的:(JavaSE,JavaSE-多线程)