摘要:線程是在進程中獨立運行的子任務。線程中斷狀態由該方法清除。測試線程對象是否已經是中斷狀態,但不清除狀態標志。高優先級的線程總數大部分先執行完,但不代表高優先級的線程全部先執行完。當進程中不存在非守護線程了,則守護線程自動銷毀。
進程是受操作系統管理的基本運行單元。
線程是在進程中獨立運行的子任務。使用多任務操作系統Windows后,可以最大限度地利用CPU的空閑時間來處理其他的任務。使用多線程可以,提高CPU利用率,也就是使用異步,線程被調用的時機是隨機的。
使用多線程技術時,代碼的運行結果與代碼執行順序或調用是無關的。隨機性。
Thread.java類中的start()方法通知“線程規劃器”此線程已經準備就緒,等待調用線程對象的run()方法。執行start()方法發順序不代表線程的啟動的順序。
共享數據的情況就是多個線程可以訪問同一個變量,會出現線程不安全的問題。
synchronized可以在任意對象及方法上加鎖,而加鎖的這段代碼稱為“互斥區”或“臨界區”。
非線程安全主要是指多個線程對同一個對象中的同一個實例變量進行操作時,會出現值被改變,值不同的情況。
雖然println()方法在內部是同步的,但i--的操作卻是在進入println()之前發生的。
currentThread()方法可返回代碼段正在被哪個線程調用的信息。
大多數停止一個線程的操作使用Thread.interrupt()方法,但這個方法不會終止一個正在運行的線程,需要加入一個判斷才可以完成線程的停止。
this.interrupted()測試當前線程是否已經中斷。當前線程是指運行this.interrupted()方法的線程。線程中斷狀態由該方法清除。
this.isInterrupted()測試線程是否已經中斷。測試線程Thread對象是否已經是中斷狀態,但不清除狀態標志。
能停止的線程——異常法
public class MyThread extends Thread{ @Override public void run() { // TODO Auto-generated method stub super.run(); try { for (int i = 0; i < 500000; i++) { if(this.isInterrupted()){ System.out.println("已經是停止狀態了!我要退出"); throw new InterruptedException(); } System.out.println("i="+(i+1)); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
public class Run { public static void main(String[] args) { try { MyThread myThread = new MyThread(); myThread.start(); Thread.sleep(2000); myThread.interrupt(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("end"); } }
如果在sleep狀態下停止某一線程,會進入catch語句,并且清除停止狀態,使之變成false;
建議使用“拋異常”法來實現線程的停止,因為在catch塊中可以對異常的信息進行相關的處理,而且使用異常流能更好,更方便地控制程序的運行流程,不至于代碼中出現很多個return,造成污染。
在使用suspend與resume方法時,如果使用不當,極易造成公共的同步對象的獨占,使得其他線程無法訪問公共同步對象。也容易出現因為線程的暫停而導致數據不同步的情況。
yield()方法的作用是放棄當前的cpu資源,將它讓給其他的任務去占用cpu執行時間。
高優先級的線程總數大部分先執行完,但不代表高優先級的線程全部先執行完。
當進程中不存在非守護線程了,則守護線程自動銷毀。典型的守護線程就是垃圾回收線程。調用thread.setDaemon(true);設置守護線程。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68062.html
摘要:使用雙檢查機制來實現多線程環境中的延遲加載單例設計模式。類主要負責日期的轉換與格式化,但在多線程環境中,使用此類容易造成數據轉換及處理的不準確,因為類并不是線程安全的。 立即加載就是使用類的時候已經將對象創建完畢,常見的實現辦法就是直接new實例化。而立即加載從中文的語境來看,有著急、急迫的含義,所以也稱為餓漢模式。 package com.zxf.demo.singleton_0; ...
摘要:如果執行任務的時間早于當前時間,則立即執行任務。其他任務不受影響。類中的方法作用是將任務隊列中全部的任務進行清空。全部任務都被清除,并且進程被銷毀。類中的方法有時并不一定會停止計劃任務,而是正常執行。 Timer類的主要作用就是設置計劃任務,但封裝任務的類卻是TimerTask類,執行計劃任務的代碼要放入TimerTask的子類中,因為TimerTask是一個抽象類。 創建1個Tim...
摘要:調用代碼的線程就持有了對象監視器,其他線程只有等待鎖被釋放時再次爭搶。使用多個對象,可以喚醒部分指定線程,有助于提升程序運行的效率。方法的作用是返回等待與此鎖定相關給定條件的線程估計數。線程在等待時間到達前,可以被其他線程提前喚醒。 調用lock.lock()代碼的線程就持有了對象監視器,其他線程只有等待鎖被釋放時再次爭搶。效果和使用synchronized關鍵字一樣,線程之間執行的...
閱讀 3219·2021-11-12 10:36
閱讀 1280·2019-08-30 15:56
閱讀 2449·2019-08-30 11:26
閱讀 558·2019-08-29 13:00
閱讀 3614·2019-08-28 18:08
閱讀 2753·2019-08-26 17:18
閱讀 1907·2019-08-26 13:26
閱讀 2438·2019-08-26 11:39