Java——多线程基本使用(四) 线程组和线程池的使用,工厂设计模式的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zoweiccc/article/details/83025633

1.线程组的概述和使用

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

             (1)默认情况下,所有线程都属于线程组

                    public final ThreadGroup getThreadGroup() //通过线程对象获取它所属于的组

                    public final String getName()      //通过线程组对象获取它组的名字

             (2)自己给线程设置分组

                    1)ThreadGroup(String name)  创建线程组对象并给其赋值名字

                    2)创建线程对象

                    3)Thread(ThreadGroup?group,Runnable?target,String?name)

                    4)设置整组的优先级或者守护线程

2.线程的五种状态

             (1)新建:创建线程对象

             (2)就绪:线程对象已启动,但是还没有获取到cpu的执行权

             (3)运行:获取到了cpu的执行权

             (4)阻塞:没有cpu的执行权,回到就绪

             (5)死亡:代码运行完毕,线程消亡 

3.线程池的概述和使用

           程序启动一个新线程成本使比较高的,因为涉及到与操作系统进行交互。使用线程池可以很好的提高性能,尤其是当程序            中要创建大量生存期很短的线程时,更应该考虑使用线程池。 线程池里的每一个线程代码结束后,并不会死亡,而是再回            到线程池中成为空闲状态,等待下一个对象来使用。

             (1)JDK5增加了一个Executors工厂类来产生线程池,有以下几个方法

                    public static ExecutorService newFixedThreadPool(int nThreads),放n条线程

                    public static ExecutorService newSingleThreadExecutor(int nThreads)

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

                    Future<?> submit(Runnable task)

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

             (2)使用步骤

                    1)创建线程池对象

                    2)创建Runnable实例

                    3)提交Runnable实例

                    4)关闭线程池

4.简单工厂设计模式的概述和使用

             又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例

             优点:客户端不需要在负责对象的创建,从而明确了各个类的指责

             缺点:他负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断地修改工厂类,不利                于后期地维护

5.工厂方法模式的概述和使用

              工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现

              优点:客户端不要在负责对象的创建,从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和具                 体的工厂类即可,不影响已有代码,后期维护容易,增强系统的扩展性

             缺点:需要额外的编写代码,增加了工作量

 

package pra_22;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class J_41 {

	/**
	 * @param args
	 * @throws ExecutionException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		//1.线程组的使用,能使一组线程的状态发生改变
		MyRun mr=new MyRun();
		Thread t1=new Thread(mr,"aa");
		Thread t2=new Thread(mr,"bb");
		ThreadGroup tg=t1.getThreadGroup();
		ThreadGroup tg2=t2.getThreadGroup();
		System.out.println(tg.getName());		//main
		System.out.println(tg2.getName());		//main
		
		ThreadGroup tg3=new ThreadGroup("new");	//创建新的线程组
		MyRun mr2=new MyRun();					//创建Runnable的子类对象
		Thread t3=new Thread(tg3,mr2,"cc");		//将线程t3放在组中
		Thread t4=new Thread(tg3,mr2,"dd");	
		System.out.println(t3.getThreadGroup().getName());	//获取组名
		System.out.println(t4.getThreadGroup().getName());
		
		//2.线程池的使用
		/*
		ExecutorService esp=Executors.newFixedThreadPool(2);	//创建线程池
		esp.submit(new MyRun());	//将线程放进池子里并执行
		esp.submit(new MyRun());
		esp.shutdown();			//关闭线程池
		*/
		
		//3.多线程程序实现的方式(使用线程池的方法)
		ExecutorService esp2=Executors.newFixedThreadPool(2);
		Future<Integer> f1=esp2.submit(new MyC(10));	
		Future<Integer> f2=esp2.submit(new MyC(100));
		System.out.println(f1.get());
		System.out.println(f2.get());
		esp2.shutdown();
		
		//4.简单工厂设计模式
		Nurse N=(Nurse)PeopleFac.Createp("nurse");
		N.work();
		Stu s=(Stu)PeopleFac.Createp("stu");
		s.work();
		
		//5.工厂方法设计模式
		StuFac sf=new StuFac();
		Stu s2=(Stu)sf.createP();
		NurseFac nf=new NurseFac();
		Nurse n2=(Nurse) nf.createP();
		s2.work();
		n2.work();
	}	

}
//线程组的使用
class MyRun implements Runnable{

	@Override
	public void run() {
		for(int i=0;i<1000;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
	
}
//简单工厂设计模式
class MyC implements Callable<Integer>{
	private int num;
	public MyC(int num){
		this.num=num;
	}
	@Override
	public Integer call() throws Exception {
		int sum=0;
		for(int i=1;i<num;i++){
			sum+=i;
		}
		return sum;
	}
}
abstract class People{
	public abstract void work();
}
class Stu extends People{

	@Override
	public void work() {
		System.out.println("School");
	}
}
class Nurse extends People{

	@Override
	public void work() {
		System.out.println("hospital");
	}
}
class PeopleFac{
	/*	这样子会定义很多方法,复用性差
	public static Stu createS(){
		return new Stu();
	}
	public static Nurse createN(){
		return new Nurse();
	}
	*/
	public static People Createp(String name){
		if("stu".equals(name)){
			return new Stu();
		}else if("nurse".equals(name)){
			return new Nurse();
		}else{
			return null;
		}
	}
}
//工厂方法设计模式
interface Fac{
	public People createP();
}
class StuFac implements Fac{

	@Override
	public People createP() {
		
		return new Stu();
	}
}
class NurseFac implements Fac{

	@Override
	public People createP() {
		
		return new Nurse();
	}
}

猜你喜欢

转载自blog.csdn.net/zoweiccc/article/details/83025633
今日推荐