1. 程式人生 > >多執行緒並行執行與順序執行(一)

多執行緒並行執行與順序執行(一)

package test;

import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 通過 join()方法並行執行執行緒。
 * @author Smile
 */
public class ThreadJoinTest {
	
	public static void main(String[] args) throws InterruptedException {
		test1();
		test2();
		test3();
	}

	public static void test1() throws InterruptedException {
    	    mThread t1 = new mThread("t1--------");
    	    mThread t2 = new mThread("t2");
            t1.start();
/**		    t1.join();   join()不傳遞引數,表示t1執行緒執行完成之後執行t2執行緒。
 * 
 *          t1.join(10); join()傳遞引數,join(10)表示主執行緒會等待t1執行緒10毫秒,10毫秒過去後,
 *      	    		 主執行緒和t1執行緒之間執行順序由序列執行變為普通的並行執行。
 *      
 *          (個人認為這種方式在非main方法中使用,存線上程進行中,方法結束導致執行緒終止的情況。)
 */
            t1.join(10);
            t2.start();
            System.out.println("執行完畢!----------test1-----------");
	}
	
	public static void test2() throws InterruptedException {
		    Vector<Thread> vectors=new Vector<Thread>();
    	    mThread t1 = new mThread("t1-----");
    	    mThread t2 = new mThread("t2");
            t1.start();
            t2.start();
            vectors.add(t1);
            vectors.add(t2);
            /**
             * 經過for迴圈遍歷,兩個執行緒會並行執行,並在兩個執行緒都執行完畢後,執行主執行緒。
             */
            for (Thread thread : vectors) {
			   thread.join();
		   }
            System.out.println("執行完畢!-----------test2------------");
	}
	/**
	 * 通過 執行緒池
	 */
	public static void test3() throws InterruptedException {
		    final Thread t1 = new Thread(new Runnable() {
                public void run() {
                   for (int i = 1; i <= 100; i++) {
                	   System.out.println("---t1---");
                   }
                }
            });
            final Thread t2 = new Thread(new Runnable() {
                public void run() {
                	for (int i = 1; i <= 100; i++) {
                 	   System.out.println("---t2---");
                    }    
                }
            });
            final Thread t3 = new Thread(new Runnable() {
                public void run() {
            	    for (int i = 1; i <= 100; i++) {
             	       System.out.println("---t3---");
                    }
                }
            });
//          此方法使用 單個任務的執行緒池來實現。保證執行緒的依次執行
            ExecutorService executor = Executors.newSingleThreadExecutor();
            executor.submit(t1);
            executor.submit(t2);
            executor.submit(t3);
            executor.shutdown(); // 結束程序
	}
}
class mThread extends Thread{
    public mThread(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=1;i<=1000;i++){
            System.out.println(this.getName() + "--------" + i);
        }
    }
}