(四十四)如何实现java多线程

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

java虚拟机允许应用程序并发地运行多个线程。

一、继承Thread类,重写run方法

Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方式就是通过Thread类的start()方法

	public class Demo extends Thread
	{
		
		Demo(String name)
		{
			super(name);
		}
		 public void run()
	    {
					    
		  System.out.println(Thread.currentThread().getName());  
 	   }
		
	    public static void main(String []args) {
	       Demo d1=new Demo("DemoThread1");
		   Demo d2=new Demo("DemoThread2");
		   
		   /*start()方法并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable)
		    * 什么时候运行多线程由操作系统决定
		    */
		   d1.start();
		   d2.start();
			
	    }
}

二、实现Runnable接口,并实现该接口的run()方法

实现同步--锁下面的例子:https://blog.csdn.net/jiangshangchunjiezi/article/details/88118063

三、实现Callable接口,重写call()方法

接口Callable<V>

方法:V  call() throws Exception 

--------------

接口Runnable

方法: void  run()

Callable 接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能,主要表现为:

①Callable可以在任务结束后提供一个返回值,Runnable方法无法提供此功能

②Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常

③运行Callable可以拿到一个Future对象

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 Demo implements Callable<String>
	{
		
		public String call() throws Exception {
			// TODO Auto-generated method stub
			return "hello world";
		}
		
		
		
	    public static void main(String []args) {
	       ExecutorService threadPool=Executors.newSingleThreadExecutor();
	       
	       //启动线程
	       Future<String> future=threadPool.submit(new Demo());
	       try {
	    	System.out.println("waiting thread to finish");
			System.out.println(future.get());//获取线程执行的返回值
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
			
	    }
}

四、如何选择

一般推荐实现Runnable接口的方式,其原因是:

①Thread类定义了很多方法可以被派生类使用或重写。但是只有run()方法是必须重写的,在run()方法中实现这个线程的主要功能。这当然是实现Runnable接口所必须的方法。

②一个类仅在他们需要被加强或修改时才会被继承。因此,如果没有必要重写Thread类中其他方法,那么通过继承Thread的实现方式与实现Runnable接口的效果相同,在这种情况下最好实现Runnable接口的方式来创建线程。

五、一个类可以同时继承Thread和实现Runnable

Demo类从Thread类中继承了run()方法,这个继承的run()可以被当做对Runnable接口的实现,因为这段代码可以编译通过

public class Demo extends Thread implements Runnable
	{
		
		
		
		
	    public static void main(String []args) {
	     Thread t=new Thread(new Demo());
	     t.run();
			
	    }
}

当然也可以不使用继承的run()方法,而是需要通过在Demo类中重写run()方法来实现Runnable接口中的run()方法。 

public class Demo extends Thread implements Runnable
	{
		public void run()
		{
			System.out.println(Thread.currentThread().getName());
		}
		
		
		
	    public static void main(String []args) {
	     Thread t=new Thread(new Demo());
	     t.run();
			
	    }
}

猜你喜欢

转载自blog.csdn.net/jiangshangchunjiezi/article/details/88130895