java學習——線程的實現/創建方式

JAVA 線程實現/創建方式

寫在前面:歡迎來到「發奮的小張」的博客。我是小張,一名普通的在校大學生。在學習之餘,用博客來記錄我學習過程中的點點滴滴,也希望我的博客能夠更給同樣熱愛學習熱愛技術的你們帶來收穫!希望大家多多關照,我們一起成長一起進步。也希望大家多多支持我鴨,喜歡我就給我一個關注吧!

方式一:繼承 Thread 類

Thread 類本質上是實現了 Runnable 接口的一個實例,代表一個線程的實例。啓動線程的唯一方法就是通過 Thread 類的 start()實例方法。start()方法是一個 native 方法,它將啓動一個新線程,並執行 run()方法。

public class MyThread extends Thread { 
	 @Override
	 public void run() { 
		 System.out.println("MyThread.run()"); 
	 } 
     public static void main(String[] args) {
        MyThread myThread1 = new MyThread(); 
		myThread1.start(); 
    }
} 

方式二:實現 Runnable 接口

如果自己的類已經 extends 另一個類,就無法直接 extends Thread,此時,可以實現一個Runnable 接口。

public class MyThread extends OtherClass implements Runnable { 
	 @Override
	 public void run() { 
		 System.out.println("MyThread.run()"); 
	 } 
      public static void main(String[] args) {
        //啓動 MyThread,需要首先實例化一個 Thread,並傳入自己的 MyThread 實例:
		MyThread myThread = new MyThread(); 
		//事實上,當傳入一個 Runnable target 參數給 Thread 後,Thread 的 run()方法就會調用
		Thread thread = new Thread(myThread); 
		thread.start(); 
     }
} 

方式三.:基於線程池的方式

線程和數據庫連接這些資源都是非常寶貴的資源。那麼每次需要的時候創建,不需要的時候銷燬,是非常浪費資源的。那麼我們就可以使用緩存的策略,也就是使用線程池。

 // 創建線程池
 ExecutorService threadPool = Executors.newFixedThreadPool(10);
 while(true) {
	 threadPool.execute(new Runnable() { // 提交多個線程任務,並執行
		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName() + " is running ..");
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	    }
	 });
 }

ExecutorService、Callable、Future 有返回值線程

有返回值的任務必須實現 Callable 接口,類似的,無返回值的任務必須 Runnable 接口。執行
Callable 任務後,可以獲取一個 Future 的對象,在該對象上調用 get 就可以獲取到 Callable 任務
返回的 Object 了,再結合線程池接口 ExecutorService 就可以實現傳說中有返回結果的多線程
了。

//創建一個線程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
// 創建多個有返回值的任務
List<Future> list = new ArrayList<Future>(); 
for (int i = 0; i < taskSize; i++) { 
	Callable c = new MyCallable(i + " "); 
	// 執行任務並獲取 Future 對象
	Future f = pool.submit(c); 
	list.add(f); 
} 
// 關閉線程池
pool.shutdown(); 
// 獲取所有併發任務的運行結果
for (Future f : list) { 
	// 從 Future 對象上獲取任務的返回值,並輸出到控制檯
	System.out.println("res:" + f.get().toString()); 
} 
博主後記:

希望看到此篇博文的小夥伴,如果發現有什麼不對的地方,歡迎在下方留言指正!博主一定虛心接受並改正!大家一起共同進步。如果對你有所幫助,可以給博主一個贊👍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章