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

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接口的方式,其原因是:

  • java不支持多继承,因此选用实现Runnable接口的类还可以再继承其他类
  • Thread类里面有很多已经实现的方法,如果这些方法用的少或者不需要重写,两种方法实现的效果是一样的。

五、一个类可以同时继承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();
			
	    }
}

 

posted @ 2019-03-05 10:50  测试开发分享站  阅读(101)  评论(0编辑  收藏  举报