zoukankan      html  css  js  c++  java
  • JAVA多线程实现的三种方式

      JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

    1.继承Thread类实现多线程

      继承Thread类的方法尽管被我列为一种多线程实现方式,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。下面举了个例子,例子中两个线程都是使用start()方法:

    public class Test_Thread{
    	public static void main(String[] args) {
    		Thread t1 = new Runner1();
    		Thread t2 = new Runner2();
    		t1.start();
    		t2.start();
        } 
    }
    class Runner1 extends Thread{
    	public void run(){
    		for(int i=0;i<10;i++){
    			System.out.println("第1线程:No"+i);
    		}
    	}
    }	
    class Runner2 extends Thread{
    	public void run(){
    		for(int i=10;i>0;i--){
    			System.out.println("第2线程:No"+i);
    		}
    	}
    }
    

    2.实现Runnable接口方式实现多线程

      如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:  

    public class Test_Runnable {
    	public static void main(String[] args) {
    		Runner1 run1=new Runner1();
    		Runner2 run2=new Runner2();
    		Thread th1 = new Thread(run1);
    		Thread th2 = new Thread(run2);
    		th1.start();
    		th2.start();
    	}
    }
    class Runner1 implements Runnable{
    	public void run(){
    		for(int i=10;i>=0;i--){
    			System.out.println("第一个线程No:"+i);
    		}
    	}
    }
    class Runner2 implements Runnable{
    	public void run(){
    			for(int i=0;i<=10;i++){
    				System.out.println("第二个线程No:"+i);
    			}
    		}
    	}
    

    3.使用ExecutorService、Callable、Future实现有返回结果的多线程

      ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 。

      返回结果的线程是在JDK1.5中引入的新特征。有返回值的任务必须实现Callable接口,类似的,无返回值的任务必须实现Runnable接口。

      执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。

    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Test_Callable implements Callable {
    	private int num;	
    	public Test_Callable (int num){
    		super();
    		this.num=num;
    	}
      public static void main(String[] args) {
    	ExecutorService exec =Executors.newCachedThreadPool();//调用call接口实现线程
    	exec.submit(new Test_Callable (1));
    	exec.submit(new Test_Callable (2));//调用线程池运行runable接口
    }	
      public Object call() throws Exception{
    	for(int i=0;i<10;i++){
    		System.out.println("第"+this.num+"线程:No"+i);
    	}
    	return null;			
    	}
    }
    

    JAVA开发版本JDK1.5之前,线程上的实现只有前两种,但是JDK1.5以后加了Callable,用以有返回的实现多线程。  

    yian
  • 相关阅读:
    web页面性能优化之接口前置
    python大佬养成计划----flask_bootstrap装饰网页
    撸个查询物流的小程序,欢迎体验
    FullCalendar插件的基本使用
    GeekforGeeks Trie
    使用Django和Python创建Json response
    nginx-gridfs的安装
    Linux kernel config and makefile system
    hadoop日志分析
    安装STS报错(三)
  • 原文地址:https://www.cnblogs.com/xiangpeng/p/7655180.html
Copyright © 2011-2022 走看看