程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Java面试篇基础部分-Java创建线程详解

balukai 2024-12-27 11:57:01 文章精选 5 ℃

多线程的方式能够在操作系统的多核配置上更好的利用服务器的多个CPU的资源,这样的操作可以使得程序运行起来更加高效。Java中多线程机制提供了在一个进程内并发去执行多个线程,并且每个线程都并行的去执行属于线程处理的自己的任务,这样可以提高程序的执行效率,让系统资源得到更加的高效的利用。

Java线程中线程的创建方式

Java多线程中创建线程的方式有以下四种

  • 1、继承Thread类
  • 2、实现Runnable接口
  • 3、通过ExecutorService和Callable<Class>实现有返回值的线程操作
  • 4、基于线程池实现

继承Thread类

Thread类自己也是实现了Runnbale接口并且定义了操作线程的方法,通过继承Thread类的方式来创建一个线程。如下所示

public TestThread extends Thread{
		 public void run(){
     
     }
}

public class Test{
	public static void main(String[] args){
  		TestThread testThread = new TestThread();
    	testThread.start();
  }

}	

首先创建一个类并且继承了Thread接口,然后实例化线程对象并且调用其start()方法来启动线程。start方法是一个native方法,通过在操作系统上启动一个新线程,并且最终执行run方法来启动一个线程。run方法的内部是线程具体的实现代码。

实现Runnble接口

基于Java编程规范,如果子类已经继承了一个类,那么就没有办法直接继承Thread类了,因为Java是单继承的方式。这个时候就可以通过实现Runnbale接口创建线程。

public class ChildTestClass extends SuperClass implements Runnable{
		public void run(){
    
    }
}

ChildTestClass childTestClass = new ChildTestClass();
Thread thread = new Thread(childTestClass);
thread.start();

通过实现Runnbale接口创建了一个ChildTestClass线程类,并且创建了对应的线程类对象,创建一个Thread的类并且以该对象作为参数传入,并且使用Thread 的start()方法启动线程执行run()方法中的执行逻辑

通过ExecutorService和Callable<Class>实现有返回值的线程

在实际开发中,会有这样一个场景,我们在主线程中开启了很多子线程,然后执行不同的处理任务,然后需要收集到各个子线程的返回结果,并且将结果进行汇总,这个时候就需要使用到Callable接口来进行操作。

具体的实现方法如下

public class MyCallable implements Callable<String>{
	private String name;
  // 通过构造函数传入参数作为线程的名称
  public MyCallable(String name){
  	this.name = name;
  }
	// call方法内为线程实现的逻辑处理操作
	@Override
	public String call() throws Exception{
  	return name;
  }
}
// 创建一个固定大小为5的线程池
ExecutorService pool = Executors.newFixedThreadPool(5);

// 创建多个有返回值的任务列表
List<Future> list = new ArrayList<Future>();
for(int i = 0;i<5;i++){
		// 创建一个有返回值的线程实例
  Callable c = new MyCallable(i+"");
  // 提交线程,获取Future对象并将其保存到Future List中
  Future future  = pool.submit(c);
  list.add(future);
 
}

//关闭线程池,等待线程执行结束
pool.shutdown();
// 遍历获取运行结果
for(Future future:list){
		future.get();
}

创建一个类并且实现Callable接口,在call方法中实现了具体的运算逻辑并且返回结算结果。具体的调用过程是,创建一个线程池、一个用于接收返回结果的Future List 以及Callable线程实例,使用线程池提交具体的任务进行执行,之后将结果保存到Future中,在执行完成之后遍历Future List中的Future对象,并且调用future对象的get方法就可以获取Callable线程任务返回具体的操作结果并且进行主线程处理。

基于线程池

线程作为一种计算资源,但是每次的创建和销毁都会浪费很多的其他资源,这个时候线程池的出现就是一种很好的资源管理策略。那么如何通过线程池来创建线程呢!

ExecutorService  threadPool = Executors.newFixedThreadPool(10);

for(int i = 0;i<10;i++){
	   threadPool.execute(new Runnable(){
    					@Override
              public void run(){
     
     					}                    
    })
}

Tags:

最近发表
标签列表