Java多线程深入理解学习笔记之八-----线程的状态转换图、线程组及线程池的简单使用

线程的状态转换图

线程组

Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。

默认情况下,所有的线程都属于主线程组。

public final ThreadGroup getThreadGroup()

我们也可以给线程设置分组

Thread(ThreadGroup group, Runnable target, String name)

实现代码如下:

		MyRunnable myRunnable = new MyRunnable();
		ThreadGroup group = new ThreadGroup("我的线程组");
//		group.setDaemon(true);---使用线程组来设置守护线程没用.....
                //使用线程的构造方法就行
		Thread thread = new Thread(group,myRunnable, "A");
		Thread thread2 = new Thread(group,myRunnable, "B");

线程默认的线程组的名字是main

这里不得不说一下有点地方真的超级坑啊,就是给线程组设置守护线程,但是这个方法即使是设置了

true后是不起作用的,这可能也是后来不推荐使用线程组的原因吧,反正有点坑

线程池

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

newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。

                                           如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。

                                   线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,

                                       当任务数增加时,此线程池又可以智能的添加新线程来处理任务。

                                       此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

newSingleThreadScheuleExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

4种线程池更简单理解

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

Future<?> submit(Runnable task)

<T> Future<T> submit(Callable<T> task)

案例演示

创建线程池对象

创建Runnable实例

提交Runnable实例

关闭线程池

实现代码如下:

package 线程池;

public class Demo implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
	}
	
}
package 线程池;

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

public class Text {
	public static void main(String[] args) {
            //设置固定大小的线程池
		 ExecutorService service = Executors.newFixedThreadPool(2);
		 Demo demo = new Demo();
		 
		 service.submit(demo);
		 service.submit(demo);
		 
		 
		 service.shutdown();
		
		
	}
}

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

猜你喜欢

转载自blog.csdn.net/acDream_/article/details/81569703