天天看點

Java多線程(一)線程基礎

定義 

    程序:一個計算機程式的運作執行個體,包含了需要執行的指令;有自己的獨立位址空間,包含程式内容和資料;不同程序的位址空間是互相隔離的;程序擁有各種資源和狀态資訊,包括打開的檔案、子程序和信号處理。

    線程:是程序中的一個執行流程,是CPU排程執行的基本機關,一個程序中可以運作多個線程;線程有自己的程式計數器、寄存器、堆棧和幀。同一程序中的線程共用相同的位址空間,同時共享進程序鎖擁有的記憶體和其他資源。

分類

    線程總體分兩類:使用者線程和守候線程。

    守護線程(damon thread),守護線程在背景運作,提供程式運作時所需的服務。當虛拟機中運作的所有線程都是守護線程時,虛拟機終止運作。

意義

    多線程不能提高程式的執行速度,其實是為了提高應用程式的使用率,不讓CPU閑置。

    程式的執行其實是搶占CPU資源,奪得CUP執行權,如果多程序下的某個程序的執行路徑比較多,那麼它就會有更高的幾率搶到CPU的執行權。多線程隻是多并發,并不是真正意義上的并行,多核系統才是真正意義上的并行。

    并發:通過CPU排程算法,讓使用者看上去同時執行,實際上,是通過CPU在高速切換,并不是真正的額同時

    并行:多個CPU執行個體或者多台機器同時執行一段處理邏輯,這就是真正的同時;

實作多線程的幾種方式

    繼承Thread類

public class MyThread extends Thread {
    public MyThread(String string) {
		super(string);
	}
	@Override
    public void run() {
		System.out.println(Thread.currentThread().getName() + " 問老師問題 .. ");
/*        while(true) {
            System.out.println(Thread.currentThread().getName() + " 問老師問題 .. ");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }*/
    }
    public static void main(String[] args) throws InterruptedException {
    	MyThread t1 = new MyThread("小明"); // 建立線程對象
    	MyThread t2 = new MyThread("小紅");
        t1.start(); // 啟動線程
        t2.start();
        System.out.println(Thread.currentThread().getName() + " is running ... "); // 列印目前線程的名字
        Thread.sleep(10000); // 休息10000ms t1,t2得到執行
        while (true) {
            System.out.println(Thread.currentThread().getName() + " is running ... "); // 列印目前線程的名字
            try {
                Thread.sleep(10000); // 休息1000ms
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }           
Java多線程(一)線程基礎

  實作Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        while(true) {
            System.out.println(Thread.currentThread().getName() + " is running .. ");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
    	MyRunnable tt = new MyRunnable(); // 執行個體化線程任務類
        Thread t1 = new Thread(tt); // 建立線程對象,并将線程任務類作為構造方法參數傳入
        Thread t2 = new Thread(tt);
        t1.start(); // 啟動線程
        t2.start();
    }
}           

    定時器:可以利用定時器建立定時任務;可以利用架構實作,如:spring的schedule和quartz;也可以用jdk提供的api實作定時任務。

public class TimerDemo {
	    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	    public static void main(String[] args) throws Exception {
	        Timer timer = new Timer();
	        /**	
	         *	 1.在某個時間點後執行任務
	         * */
	        timer.schedule(new TimerTask() {
	            @Override
	            public void run() {
	            	String curentTime = format.format(new Date());
	                System.out.println(curentTime+":定時任務執行了....");
	            }
	        }, format.parse("2018-07-05 23:44:00"));
	        /**	
	         * 	2.延時一段時間執行任務
	         * */
	        timer.schedule(new TimerTask() {
				@Override
				public void run() {
					System.out.println("五秒後說:歡迎光臨.....");
				}
			}, 5000);
	        /**
	         * 	3.每隔一段時間執行任務
	         * */
	        timer.schedule(new TimerTask() {
				@Override
				public void run() {
					System.out.println("每隔五秒說:歡迎光臨.....");
				}
			}, new Date(),5000);
	    }
	}           
Java多線程(一)線程基礎

    結合ExecutorService+Callable+Future實作具有傳回結果的多線程,可結合線程池架構Executors架構實作。 詳見:https://blog.csdn.net/zz_ddup/article/details/79945780

繼續閱讀