线程的状态转换图
线程组
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:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。
•这些方法的返回值是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();
}
}
线程池的好处:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。