Java多线程由易到难
2019獨角獸企業重金招聘Python工程師標準>>>
線程可以驅動任務,因此你需要一種描述任務的方式,這可以由Runnable接口來提供。要想定義任務,只需實現Runnable接口并編寫run方法,使得該任務可以執行你的命令。
public class LiftOff implements Runnable {protected int countDown = 10;private static int taskCount = 0;//id可以用來區分任務的多個實例private final int id = taskCount++;public LiftOff(){System.out.println("調用了無參的構造函數"); }public LiftOff(int countDown){this.countDown = countDown;System.out.println("調用了有參的構造函數\n"+ "參數內容為:"+countDown); }public String status(){return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff!") + "),";}@Overridepublic void run() {while(countDown-- > 0){System.out.println(status());//使當前線程從執行狀態(運行狀態)變為可執行態(就緒狀態)。//cpu會從眾多的可執行態里選擇,也就是說,//當前也就是剛剛的那個線程還是有可能會被再次執行到的,//并不是說一定會執行其他線程而該線程在下一次中不會執行到了。Thread.yield();}}public static void main(String[] args) {LiftOff test1 = new LiftOff();test1.run();System.out.println("\n");LiftOff test2 = new LiftOff(5);test2.run();}}將Runnable對象轉變為工作任務的傳統方式是把它提交給一個Thread構造器,
Thread構造器只需要一個Runnable對象。調用Thread對象的start()方法為該線程執行必需的初始化操作,
然后調用Runnable的run()方法,以便在這個新線程中啟動該任務。因為main()方法和LiftOff.run()是由不同
的線程執行的,因此程序同時運行兩個方法。
線程調度沒有順序的,由CPU決定。
接下來通過java.util.concurrent包中的執行器(Executor)將為你管理Thread對象,從而簡化了并發編程。
1:CachedThreadPool首先會按照需要創建足夠多的線程來執行任務(Task)。隨著程序執行的過程,有的線程執行完了任務,可以被重新循環使用時,才不再創建新的線程來執行任務
對shutdown()方法的調用可以防止新任務被提交給這個Executor,當前線程(即驅動main()的線程)將
繼續運行在shutdown()被調用之前提交的所有任務。這個程序將在Executor中的所有任務完成之后盡快退出。
2:FixedThreadPool模式會使用一個優先固定數目的線程來處理若干數目的任務。規定數目的線程處理所有任務,一旦有線程處理完了任務就會被用來處理新的任務(如果有的話)。
最好把3換成Runtime.getRuntime().availableProcessors(),這樣能更大程度利用你的電腦CPU處理。
3:SingleThreadExecutor就像是線程數量為1的FixedThreadPool。如果多個任務被提交給SingleThreadExecutor的話,那么這些任務會被保存在一個隊列中,并且會按照任務提交的順序,一個先執行完成再執行另外一個線程。SingleThreadExecutor模式可以保證只有一個任務會被執行。這種特點可以被用來處理共享資源的問題而不需要考慮同步的問題。
轉載于:https://my.oschina.net/zhangjie5201314/blog/797706
總結
以上是生活随笔為你收集整理的Java多线程由易到难的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CNN卷积神经网络误差反传推导
- 下一篇: 使用subs和evals函数对sympy