线程组:默认情况下是main线程组
getThreadGroup()获得线程组
Thread.currentThread().getThreadGroup().getName();返回线程组的名字。
改变线程组
首先创建一个线程组:ThreadGroup tg=new ThreadGroup("这是一个新的线程组");
然后Thread t1=new Thread(tg,Myrunnale,"线程名");
通过线程组名称设置后台线程,tg.setDaemon() 设置守护线程。等等
线程组主要是对线程统一管理。
同步还可以在类里,把相应的方法设置成synchronized 注意方法里面的锁的对象是this
线程池:程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互,二使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存周期很短的线程时,更应该考虑使用线程池。
线程池每个线程结束后不会销毁,而是回到线程池变成空闲状态。
A:创建一个线程池对象,控制要创建几个线程对象
ExecutorServoce newFixedThreadPool(int nThread)
B:这种线程池的线程可以执行:
可以执行Runnable对象或者CallAble对象代表的线程
做一个实现Runnable接口
C:调用如下方法即可:
Future<?> submit(Runnable task)
<T> Future<T> submit(Callable<T> task)
newFixedThreadPool静态函数,直接调用
- ExecutorService pool=Executors.newFixedThreadPool(2);
- pool.submit(new MyRunnable);
复制代码
结束线程池:pool.shutdown();
创建多线程方式3:
Callable是个接口 这个线程有返回接口,但是runnable没有返回结果。 跟 Runnable用法相似
他是通过线程池来创建线程。 这个不常见
Future 表示submit异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。 麻烦,一般不用。
匿名内部类使用多线程“
- //集成Thread类来实现多线程
- new Thread(){
- public void run() {
- for (int i = 0; i < 100; i++) {
- System.out.println(Thread.currentThread().getName()+":"+i);
- }
- };
- }.start();
- //用Runnable接口实现
- new Thread(new Runnable() {
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- for (int i = 0; i < 100; i++) {
- System.out.println(Thread.currentThread().getName()+":"+i);
- }
- }
- }){}.start();
复制代码
但是对于,走的是子类的,即会输出world,不会输出hello
- new Thread(new Runnable() {
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- for (int i = 0; i < 100; i++) {
- System.out.println("hello"+":"+i);
- }
- }
- }){
- public void run() {
- for (int i = 0; i < 100; i++) {
- System.out.println("world"+":"+i);
- }
- };
- }.start();
复制代码