JAVA中CyclLink怎么用_Java多線程基本使用一

1? ? ? 多線程--初步

1進程

比如:QQ、迅雷、360、飛秋...

2線程的概念

3線程的意義:

4.Java程序的運行原理

代碼是運行在線程中的,如果一個進程沒有線程,那么進程就結束了,也就是說一個進程至少要有一個線程

當開啟一個Java程序之后,在進程中至少會自動創建兩個線程:主線程、垃圾回收線程

實際上,使用多線程并不是為了提高程序運行的速度,而是為了提高CPU的使用率

多線程:在進程中同時執行著多個執行路徑,并且多個線程(執行路徑)之間互不干擾

使用場景:

迅雷下載、360多個任務的執行、QQ視屏和文件傳輸………

for(int i=10;i<=100;i+=10){

System.out.println("洗衣服,進度"+i+"%");

Thread.sleep(500);

}

for(int i=0;i<=100;i+=10){

System.out.println("做飯,進度"+i+"%");

Thread.sleep(500);

}

//創建

WashThread wash = newWashThread();

CookThread cook = newCookThread();

//啟動

wash.start();

cook.start();

for(inti=10;i<=100;i+=10){

System.out.println("微波爐加熱,進度"+i+"%");

try {

Thread.sleep(500);

} catch(InterruptedException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

//每隔10秒打印Hello,同時可以接受用戶輸入,并打印出來

Scanner s = newScanner(System.in);

PrintThread t = newPrintThread();

t.start();

while(true){

String line =s.nextLine();

System.out.println(line);

}

//選擇性學習

LagRunnable r = newLagRunnable();

ExecutorService service =Executors.newCachedThreadPool();

service.execute(r);

service.execute(r);

service.execute(r);

service.shutdown();

//**************************************

FileReader fr = newFileReader("g:/config.txt");

BufferedReader br = newBufferedReader(fr);

//?????????????? ReverseRunnable r =newReverseRunnable();

String name = br.readLine();

Class clz =Class.forName(name);

Runnable r=(Runnable)clz.newInstance();

//**************************************

//以上部分選擇性學習,擴展內容

Thread t = new Thread(r);

t.start();

進程運行起來的程序

線程可以理解為一個子進程

進程間進行切換的代價較大,不能共享資源

線程間切換代價小,可以共享數據和邏輯

Java進程每運行一個java應用程序,就會啟動一個虛擬機進程,我們的程序就在其中運行

Java線程每個java進程中都默認有一個主線程,名字為main

(我們之前的程序都是在主線程中執行)

Thread類java中的線程,在一個線程中的代碼邏輯就像被一根線串起來一樣,從前往后順序執行的

,節省時間、避免程序阻塞帶來的問題

分時復用多個線程不停地快速切換使用CPU,表面上看是同時執行,其實也是有先后順序的,同一時間只有一個線程占有CPU。

創建-->就緒-->運行-->結束

運行-->阻塞--〉就緒

假如當前計算機只有一個CPU且只有一個核心,那么CPU在某一個時刻只能執行一條指令,線程只有得到CPU時間片,也就是使用權,才可以執行指令,那么Java是如何對線程進行調用的呢?

搶占調度模型:優先讓優先級高的線程使用CPU,如果線程的優先級相同,那么會隨機選擇一個,優先級高的線程獲取CPU時間片相對多一些

Java使用的是搶占式調度模型

優先級:獲取CPU資源的幾率

優先級越高的線程會獲取越多的運行機會

優先級的取值范圍是1-10之間的整數

Java將差別最大的三個優先級定義成了Thread類中的靜態常量

MAX_PRIORITY:最高優先級(10)

MIN_PRIORITY:最低優先級(1)

NORM_PRIORITY:默認優先級(5)

可以通過setPriority()和getPriority()方法進行設置和獲取

線程的創建和使用

在Java中一切皆對象,線程這一類事物也用了一個類來進行了描述,這個類叫做Thread類

線程的創建

1、繼承Thread類

2、實現Runnable接口

1、 通過繼承Thread類會出現單繼承的問題,通過實現Runnable接口可以避免單繼承的不足

2、 通過實現Runnable接口可以將線程的任務從線程的子類中分離出來,進行單獨的封裝,按照面向對象的思想將任務封裝成了對象,并且可以方便實現多個線程的數據共享

1、定義一個類繼承Thread,重寫父類的run()方法,在run()中寫上要在子線程中執行的邏輯

2、創建定義好的類,生成一個實例

3、調用這個實例的start(),啟動線程(不要調用run(),這個run()是一個回調方法)

1、定義一個類實現Runnable接口,實現抽象方法run(),在run()中寫上要在子線程中執行的邏輯

2、創建一個Thread實例,從構造方法參數傳入1中定義類的實例

3、調用start()

Runnable方式從設計上耦合度更低,更靈活

@Override

public void run() {

int progress = 0;? //初始化為0

while(true){

System.out.println(Thread.currentThread().getName()

+"燒飯,進度"+progress+"%");

if(progress ==100){//進度到100停止循環

break;

}

try {

Thread.sleep(100);

} catch(InterruptedException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

progress++;?? //每次進度+1

}

}

Threadt1 = new Thread(new CookRunnable());

t1.start();

Thread t2 = new Thread(newCookRunnable());

t2.start();

CookRunnabler=newCookRunnable();

Threadt1=newThread(r);//兩個線程使用同一個Runnable對象

Threadt2=newThread(r);

//以下方式不能共享,因為是分別使用了兩個Runnable對象的兩個progress屬性

/* Thread t1 = new Thread(newCookRunnable());

Thread t2 = new Thread(newCookRunnable());*/

t1.start();//啟動

try{

Thread.sleep(50);//錯開50毫秒

}catch(InterruptedExceptione) {

//TODOAuto-generated catch block

e.printStackTrace();

}

t2.start();//啟動另一個線程

}

1、局部變量不能被多個線程共享

2、成員變量可以被線程共享

Thread t = new Thread(new Runnable() {

@Override

publicvoid run() {

System.out.println("開始睡眠");

try{

Thread.sleep(20000);//睡眠20秒

}catch (InterruptedException e) {

//TODO Auto-generated catch block

System.out.println("睡到一半被斷了");

}

System.out.println("結束睡眠");

}

});

t.start();

try{

Thread.sleep(5000);

}catch (InterruptedException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

t.interrupt();//啟動子線程5秒后打斷它的睡眠

}

線程的優先級:

t2.setPriority(10);

t1.start();

t2.start();

Stop方法讓線程停下:

public class CycleRunnable implements Runnable{

privateboolean control = true;

publicvoid setControl(boolean control) {

this.control= control;

}

@Override

publicvoid run() {

while(control){

try{

Thread.sleep(3000);

}catch (InterruptedException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

publicstatic void main(String[] args) {

CycleRunnabler =new CycleRunnable();

Threadt = new Thread(r);

t.setName("停不下來的線程");//設置線程名字

t.start();

Scanners = new Scanner(System.in);

while(true){

Stringline = s.nextLine();

System.out.println("line="+line);

if(line.equals("stop")){

r.setControl(false);

break;

}

}

}

禮讓Yield():

Thread t2 = new Thread(new Runnable() {

@Override

publicvoid run() {

for(inti=1;i<=1000;i++){

System.out.println("????? "+i);

Thread.yield();//讓給別的線程使用CPU

//讓當前正在執行的線程釋放CPU資源,讓其他線程有機會去搶占CPU資源

//有可能在釋放CPU資源之后,立馬自己又再搶到了CPU資源

}

}

});

Thread.currentThread()通過Thread的靜態方法獲得當前線程的對象,還可以調用這個對象的getName()方法獲取其名字

Thread.sleep(longm)通過這個靜態方法,可以睡眠m毫秒,當前線程睡眠

setName(Stringn)設置線程名

intgetPriority()獲取優先級,數字越大優先級越高,優先級高則搶占CPU成功的概率高一些,優先級范圍1-10,默認5

setPriority(intp)設置優先級

yield()讓出CPU使用權,但可以馬上再搶回來

interrupt()方法,能打斷一個線程sleep()、wait()、join()等方法,能讓這些方法拋出InterruptedException

join()會合,等待子線程直到它結束,加入當前正在運行的線程,等待加入的線程執行完,再繼續執行被加入的線程

setDaemon(boolean)方法將指定的線程設置為后臺線程,設置守護線程,所有前臺線程都結束后,后臺線程(守護線程)會自動結束,該方法要在start()方法之前調用

線程加入:

public class ThreadJoinDemo{

public static void main(String[] args) throwsInterruptedException {

//線程加入

ThreadJoin t1 = new ThreadJoin("線程A");

ThreadJoin t2 = new ThreadJoin("線程B");

ThreadJoin t3 = new ThreadJoin("線程C");

t1.start();

/**

* 加入線程,讓指定的線程(t1)加入到當前正在運行的線程(主線程)中

* 并且保證指定的線程執行完之后,在繼續執行當前線程

*/

t2.start();

t1.join();

t3.start();

}

}

class ThreadJoin extends Thread{

public ThreadJoin(String name){

super(name);

}

public void run(){

for(int i=0;i<10;i++){

try {

Thread.sleep(500);

System.out.println(Thread.currentThread().getName()+"......."+i);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

守護線程(后臺線程):

public classThreadDaemonDemo {

public static void main(String[] args) throwsInterruptedException {

// 設置守護線程

ThreadDaemon t1 = new ThreadDaemon("線程A");

ThreadDaemon t2 = new ThreadDaemon("線程B");

ThreadDaemon t3 = new ThreadDaemon("線程C");

t1.start();

Thread.sleep(5000);

/*

* 設置守護線程(后臺線程)

* 開啟的線程默認都是前臺線程,可以通過setDaemon(boolean)方法將指定線程設置為后臺線程,

* 當所有前臺線程都結束之后,后臺線程會自動結束(無論有沒有執行完)

*

* 現在,t1和主線程是前臺線程,而t2和t3被設置為后臺線程,也就是說當t1和主線程都結束之后,

* 也就代表前臺線程全部結束了,那么兩個后臺線程(t2和t3)會自動結束

*/

t2.setDaemon(true);

t3.setDaemon(true);

t2.start();

t3.start();

}

}

class ThreadDaemon extendsThread {

public ThreadDaemon(String name) {

super(name);

}

@Override

public void run() {

for (int i = 1; i <= 20; i++) {

try {

Thread.sleep(500);

System.out.println(getName() +"..." +i);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

線程停止:

public class ThreadStop {

public static void main(String[] args) throwsInterruptedException {

Stops t1 = new Stops("線程A");

t1.start();

// 3秒之后停止子線程運行

Thread.sleep(3000);

// 1)使用stop方法

// t1.stop();

// 2)設置標記

// 停止線程最本質的原理其實就是讓run()方法執行完

// t1.setFlag(false);

// 3)使用interrupt方法

t1.interrupt();

// System.out.println("結束線程");

}

}

class Stops extends Thread{

private boolean runFlag = true;

public Stops(String name){

super(name);

}

@Override

public void run() {

// while(flag) {

while(!isInterrupted()) { // 判斷中斷標記是否為true

System.out.println("子線程...");

try {

/*

* 阻塞狀態會被中斷標記終止,如果是被強制終止阻塞狀態的話會拋出中斷異常(InterruptedException)

* 并且在結束阻塞狀態之后,會清除中斷標記(也就是說isInterrupted()返回值為false)

*/

Thread.sleep(6000);

} catch (InterruptedException e) {

//打印異常信息

// e.printStackTrace();

break;

}

}

System.out.println("線程已經運行完畢...");

}

public? voidsetFlag(boolean flag){

this.runFlag = flag;

}

}

1.stop()方法,不建議使用,要讓線程結束,就讓它執行完;可以使用一個條件變量作為線程中循環條件,然后在外界通過控制這個變量,來使得線程結束(終止線程,已被廢棄,不推薦使用)

2、設置標記

3.interrupt():中斷線程的阻塞狀態,調用該方法之后,線程會標記一個中斷標記,當線程處于阻塞(比如休眠) 狀態時,如果線程具備中斷狀態,就會直接中斷當前的阻塞狀態,并去除中斷標記

(isInterrupted():測試線程是否已經中斷)

PS:停止線程最本質的原理其實就是讓run()方法執行完

生命周期:生命周期:從創建到結束的整個過程,在這期間會包含很多階段(狀態)

新建狀態(New):MyThread??t1 = new MyThread();

就緒狀態(Runnable):調用start()方法,使線程具有了運行資格,但是沒有CPU的執行權(就緒隊列:CPU在分配執行權的時候是在就緒隊列中隨機和挑選一個線程并分配其執行權(CPU調度)),等待CPU調度

運行狀態(Running):獲取了CPU的執行權,只有在運行狀態下的線程才具備CPU的執行權

阻塞狀態(Blocked):在運行狀態下調用了sleep、wait或其他的一切方法使線程進入阻塞狀態(睡眠池、等待池)

【sleep(毫秒值)《睡眠池:一塊內存池,集合對象或數組》?? wait()《等待池》】

《睡眠結束(時間結束或被中斷)被喚醒(notify) -à>>>會再次進入就緒狀態》

死亡狀態(Dead):stop()??? run()執行完《線程一旦結束進入死亡之后,就沒有用了,該狀態是不可逆的》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397004.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397004.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397004.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

指針分析

int *a; int b 4; a &b; //a:b的地址 //*a 取b地址的值&#xff0c;為4 //&a為指針變量的地址 //*(&a)為指針變量儲存的地址 即為a int **b &a; //b為指針變量a的地址 //*b為指針變量a所儲存的地址 //改變*b(指針變量所儲存的地址)即改變了*b的值轉載于:http…

live server插件怎么用_分享幾個我日常使用的VS Code插件

在這篇文章中&#xff0c;我想介紹一下自己日常使用中最喜歡的Visual Studio Code擴展。大多數時候&#xff0c;我用VS Code編寫的是JavaScript應用程序(標準JavaScript、React、Angular、NodeJS……各式各樣)。Bracket Pair Colorizer 2這個擴展很不錯&#xff0c;可以幫助我搞…

Xtrabackup數據全備份與快速搭建從服務器

Percona Xtrabackup可以說是一個完美的數據備份工具。特別是當數據庫的容量達到了一定數量級的時候且存在單表達到幾十G的數據量&#xff0c; 很難容忍一些邏輯備份的漫長時間。如單個數據庫約200G&#xff0c;單表最大為120G&#xff0c;mysqldump邏輯備份的時間長達20多小時。…

簡單的java方法_Java簡單實用方法一

整理以前的筆記&#xff0c;在學習Java時候,經常會用到一些方法。雖然簡單但是經常使用。因此做成筆記&#xff0c;方便以后查閱這篇博文先說明構造和使用這些方法。1&#xff0c;判斷String類型數據是否為空String類型的數據為空&#xff0c;主要為等于null或”“那么只要判斷…

Android應用程序開發

第一章 Android應用初體驗 1.1應用基礎 activity是Android SDK中Activity類的一個具體實例&#xff0c;負責管理用戶與信息屏的交互。 應用的功能是通過編寫一個個Activity子類來實現的。 布局定義了一系列用戶界面對象以及它們顯示在屏幕上的位置。組成布局的定義保存在XML文件…

phonegap

phonegap 框架詳解 轉自&#xff1a;http://www.cnblogs.com/hubcarl/p/4216844.html首先, 來看一下phonegap 初始化流程以及Native 與 JS 交互流程圖。 說明&#xff1a;socket server模式下, phonegap.js 源碼實現的采用1 毫秒執行一次XHR請求, 當Native JS 隊列里面有JS語…

j2ee核心模式_Operator和Sidecar正在成為軟件交付新模式

現如今的開發人員希望可以開發出具備彈性和可擴展的分布式系統。該系統受益于軟件復用和開源模型創新&#xff0c;針對安全性問題能夠輕易完成補丁更新并進行低風險的升級。該系統不可能通過帶有各種嵌入式語言庫的應用程序框架來實現。最近&#xff0c;一篇關于“多運行時微服…

微信JS-SDK選擇相冊或拍照并上傳PHP實現

理解&#xff1a;微信上傳接口是拍照&#xff0c;或者選擇本地照片&#xff0c;上傳到微信的服務器&#xff0c;獲取到一個id&#xff0c;通過token與這個id獲取到圖片&#xff0c;保存到服務器即可。 效果 通過微信js接口&#xff0c;調用底層程序。 需要引入js文件&#xff0…

JMS-ActiveMQ學習-3 ActiveMQ與Spring集成

Spring下開發消息的發送和接收程序 點對點模式 一、創建生產者項目 1.創建maven項目 2.添加spring-jms、jms規范、activemq依賴 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms&…

看libevent所遇到的英語生詞

libevent – an event notification library The libevent API &#xff08;libevent應用程序&#xff09;provides a mechanism&#xff08;機制&#xff09; to execute&#xff08;執行&#xff09; a callback function&#xff08;回調函數&#xff09; when a specific&a…

java中迭代器要導包嗎_java 中迭代器的使用方法詳解

java 中迭代器的使用方法詳解前言&#xff1a;迭代器模式將一個集合給封裝起來&#xff0c;主要是為用戶提供了一種遍歷其內部元素的方式。迭代器模式有兩個優點&#xff1a;①提供給用戶一個遍歷的方式&#xff0c;而沒有暴露其內部實現細節&#xff1b;②把元素之間游走的責任…

android socket 長連接_TCP/IP,http,socket,長連接,短連接

點擊上方藍色字體&#xff0c;選擇“標星公眾號”優質文章&#xff0c;第一時間送達上一篇&#xff1a;這300G的Java資料是我師傅當年給我的&#xff0c;免費分享給大家下一篇&#xff1a;這200G的Java實戰資料是我師傅當年教我的第二招作者 | ksfzhaohui來源 | my.oschina.net…

二、Python安裝擴展庫

第一步:推薦easy_install工具 下載地址:https://pypi.python.org/pypi/setuptools 下載"ez_setup.py"文件; 通過運行cmd命令找到ez_setup.py文件所在目錄,通過命令[python ez_setup.py]執行安裝easy_install 安裝成功截圖 第二步:安裝擴展酷 例如安裝"suds"…

ORACLE 10.2.01升級10.2.05 for windows 詳細文檔

最近要做一個數據庫的升級工作&#xff0c;提前在自己的PC機上練習了一下&#xff0c;這種文檔在網上很多&#xff0c;但是大多都是使用命令編輯腳本&#xff0c;其實數據庫還有一個DBUA的升級工具可以使用&#xff0c;使升級工作方便了很多。 OS環境&#xff1a;windows XP 32…

php 導出mysql 結構_導出結構和數據(如phpmyadmin)

在這里,您可以找到一個全面的解決方案來轉儲MySQL結構和數據,比如在PMA中(不使用exec、passthru等):它是Dszymczuk項目的一個分支,有我的增強功能。用法很簡單//MySQL connection parameters$dbhost localhost;$dbuser dbuser;$dbpsw pass;$dbname dbname;//Connects to my…

tableViewCell的操作

在iOS的開發過程中&#xff0c;tableView的使用永遠都是最常用的控件。今天學習了一下tableViewCell的操作。代碼并不是很復雜&#xff0c;如果有OC開發經驗的人&#xff0c;應該很容易看懂的。 class ViewController: UIViewController ,UITableViewDelegate, UITableViewData…

stm32正交編碼器 原理圖_惡劣環境下應用的電感式增量編碼器和絕對編碼器

編碼器可分為兩種基本類型 - 增量編碼器和絕對編碼器。增量編碼器的顯著特征是它報告角度的變化。換句話說&#xff0c;當增量編碼器通電時&#xff0c;它不會報告其角位置&#xff0c;直到它具有測量的參考點。絕對編碼器明確地在比例或范圍內報告其位置。換句話說&#xff0c…

【SqlServer】Sqlserver中的DOS命令操作

輸入osql ?查看是否支持當前版本&#xff0c;如果是SQL Server 2005以上用Sqlcmd , 以下用Osql連接數據庫&#xff08;a&#xff09;Osql -S localhost -U username -P password(SQL Server身份驗證&#xff0c;需要用戶民和密碼)&#xff08;b&#xff09;Osql -S localhos…

微信小程序內訓筆記

2016年9月22日凌晨微信官方正式宣布“小程序”開始內測&#xff0c;有“微信之父”之稱、騰訊集團高級執行副總裁張小龍在2016年末對外宣布“小程序“應用將于2017年1月9日正式推出 這一次微信還是按照慣例&#xff0c;通過機器跑出的數據&#xff0c;首先將“小程序”開放給了…

python基礎代碼的含義_Python基礎學習篇

原標題&#xff1a;Python基礎學習篇 1、編碼 默認情況下&#xff0c;Python 3 源碼文件以 UTF-8 編碼&#xff0c;所有字符串都是unicode 字符串。 當然你也可以為源碼文件指定不同的編碼&#xff1a;# -*- coding: cp-1252 -*- 2、標識符 第一個字符必須是字母表中字母或下劃…