1、线程组
将多个线程组合到一起,可以对一批线程直接管理,java允许对线程组直接控制。
2.线程组ThreadGroup类
public final ThreadGroup getThreadGroup():获取线程组对象,默认所有的线程都属于主线程组
public final String getName():获取线程组对象的名称
Thread.currentThread().getThreadGroup().getName():获取当前线程组的名称
ThreadGroup(String name):设置线程组名称
Thread(ThreadGroup group, Runnable target, String name):设置线程属于哪个组以及线程实现的接口、线程组的名称
3、线程池
线程池里的每一个线程结束后并不会死亡,而是回到线程组变为就绪状态,等待下一个对象来使用。
4、创建线程池对象的方法
Executors工厂类的方法:
public static ExecutorService newFixedThreadPool(int nThreads):线程池中创建指定数量的线程对象
public static ExecutorService newCachedThreadPool():
public static ExecutorService newSimpleThreadPool():线程池中含有单个线程
线程池执行实现run()方法的Runnable接口的对象或者实现call()方法的Callable接口的对象的线程
Future<T> submit(Runnable task):
<T> Future<T> submit(Callable<T> task):
关闭线程池:
pool.shutdown()
5、创建线程的第三种方法:
实现Callable接口,但这种方式只能依赖线程池
Callable接口是带有泛型的接口,其泛型就是实现的call()方法的返回值类型
实例:
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Object> {
private static int num = 0;
MyCallable(int num) {
this.num = num;
}
@Override
public Object call() throws Exception {
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getThreadGroup().getName()+
Thread.currentThread().getName()+":"+i);
}
return null;
}
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class demo3 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//创建线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//执行实现call()方法的Callable接口的线程对象
Future<Object> f1 = pool.submit(new MyCallable(50));
Future<Object> f2 = pool.submit(new MyCallable(100));
//获取call()方法的返回值对象
Object obj1 = f1.get();
Object obj2 = f2.get();
System.out.println(obj1);
System.out.println(obj2);
//关闭线程池
pool.shutdown();
}
}