在java中5 % 3_Java基礎5

Java多線程:

進程:進行中的程序

線程:就是進程中一個負責程序執行的控制單元(執行單元)

一個進程中可以多執行路徑,稱之為多線程

一個進程至少一個線程

開啟多個線程是為了同時運行多部分代碼

每個線程都有自己運行的內容,這個內容成為線程要執行的任務

多線程的好處:解決了多部分同時運行的問題

多線程的弊端:線程太多回到效率的降低

其實應用程序的執行都是CPU在做著快速的切換完成的,這個切換是隨機的

JVM啟動時就啟動了多個線程,至少有兩個線程

1.執行main函數的線程

該線程的任務代碼都定義在main函數里

2.負責垃圾回收的線程

如何創建一個線程:

方式一:繼承Thread類

步驟:

1.創建一個類繼承Thread類

2.重寫Thread的run方法//重寫run方法

3.直接創建Thread類的子類對象C創建線程

4.調用start方法開啟線程并調用線程的任務run方法執行

class Demo extends Thread

{

private String name = "弟鴿";

Demo(String name)

{

super(name);

//this.name = name;

}

public void run(){

for(int i=1;i<10;i++)

{

for(long j= -199999999;j<199999999;j++){ }

system.out.println(name+"*****"+i+"--------"

+Thread.currentThread().getName());

}

}

}

main(){

Demo d1 = new Demo("臠割");

Demo d2 = new Demo("兒紙");

//d1.run();

//d2.run();

d1.start();

d2.start();

}

可以通過Thread的getName獲取線程的名稱 Thread—(0開始)

主線程的名稱是 main

創建線程的目的是為了開啟一條執行路徑,去運行指定的代碼和其他代碼同時運行

而運行的指定代碼就是這個執行路徑的任務

JV創建的主線程的任務都定義在主函數里

自定義的線程的任務在run方法里;

Thread類用于描述線程,線程是 需要任務的,所以Thread類也對任務的描述,這個任務就通過Thread類中的run方法實現。也就是說,run方法就是封裝自定義線程運行任務的函數。

run方法中定義的就是線程要運行的任務代碼

開啟線程是為了運行指定代碼,所以只有繼承Thread類,并復寫run方法,將要運行的代碼定義在run方法中即可。

run()和start()的區別:

1.start()可以啟動一個新的線程

2.start()不能重復調用run()可以

3.start()中的run()代碼可以不執行完就繼續執行下面的代碼,即進行了線程切換。直接調用run()方法必須等待其代碼全部執行完才能繼續執行下面的代碼

4.start()實現了多線程,run()沒有實現多線程

臨時阻塞狀態 具備執行資格但不具備執行權 正在等待執行權

↑? ↑

↓? ? ? ? ? ? ? ? ? ? ? ↑

進程--->start()--->運行--->sleep(time)--->凍結//釋放執行權的同時

| --->? wait()? --->↑? 釋放執行資格

stop()

|

消亡

cpu執行資格: 可以被cpu處理,在處理隊列中排隊

cpu的執行權: 正在被cpu處理

創建線程的第二種方法:

1.定義類實現Runnable接口

2.覆蓋接口種的run方法,將線程的任務代碼封裝到run方法中

3.通過Tread類創建對象,并將Runnable接口的子類對象作為Thread類的構造函數的參數進行傳遞。(原因是線程任務都封裝在Runnable接口子類對象的run方法中,所以在線程對象創建時就得明確要運行的任務。)

4.調用線程對象的start方法開啟線程

class Demo2 implements Runnable //準備擴展Demo2類的功能,讓其中的內容作為線程的任務執行

//通過接口的形式完成

{

public void run()

{

show();

}

public void show(){

for(int i=1;i<10;i++)

{

for(long j= -199999999;j<199999999;j++){}

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

}

}

}

main()

{

Demo2 d3 = new Demo2();

Thread t1 = new Thread(d3,"辦證");

Thread t2 = new Thread(d3,"學妹介紹Q");

t1.start();

t2.start();

}

Runnable接口:將線程的任務進行了對象的封裝

實現Runnable接口的好處:

1.將線程的任務從線程的子類中分離出來,進行了單獨的封裝

按照面向對象的思想將任務的封裝成對象

2.避免了Java單繼承的局限性

故較為常用的是實現Runnable

線程安全問題產生的原因:

1.多個線程在操作共享的數據

2.操作共享數據的代碼有多條

當一個線程在執行操作共享數據的多條代碼過程中,其他線程參與了運算

就會導致線程安全問題的產生

解決思路:

就是將多條操作共享數據的線程代碼封裝起來,當有線程在執行這些代碼的時候,必須要當成線程把這些代碼都執行完畢后,其他線程才可以? ------->局部代碼塊

在Java中用同步代碼塊就可以解決這個問題

synchronized(對象)

{

局部代碼;

}

同步的好處:

解決了線程的安全問題

同步的弊端:

相對降低了效率,因為同步外的線程都會判斷同步鎖。

同步的前提:

同步中必須有多個線程嗎,并使用同一個鎖。

同步函數的鎖是this

同步函數和同步代碼塊的區別:

1.同步函數的鎖是固定的this

同步代碼塊的鎖是任意的對象

建議使用同步代碼塊

當同步函數為static時,鎖為this.getClass()即該函數所屬字節碼文件對象,可用getClass()方法獲取,也可以用當前

類名.class 表示。

死鎖:

class DeadLockTestDemo implements Runnable

{

private boolean flag;

DeadLockTestDemo(boolean flag)

{

this.flag = flag;

}

public void run()

{

if(flag)

{

while(true)

synchronized(MyLock.lockA)

{

System.out.println(Thread.currentThread().getName()+"--If--->LockA");

synchronized(MyLock.lockB)

{

System.out.println(Thread.currentThread().getName()+"--If--->LockB");

}

}

}

else

{

while(true)

synchronized(MyLock.lockB)

{

System.out.println(Thread.currentThread().getName()+"--Else--->LockB");

synchronized(MyLock.lockA)

{

System.out.println(Thread.currentThread().getName()+"--Else--->LockA");

}

}

}

}

}

class MyLock

{

public static final Object lockA = new Object();

public static final Object lockB = new Object();

}

public class DeakLockTest {

public static void main(String[] args) {

DeadLockTestDemo dlt1 = new DeadLockTestDemo(true);

DeadLockTestDemo dlt2 = new DeadLockTestDemo(false);

Thread t1 = new Thread(dlt1);

Thread t2 = new Thread(dlt2);

t1.start();

t2.start();

}

}

進程間的通信:

等待/喚醒機制

1.wait():讓cpu處于凍結狀態,被wait的線程會被存儲到線程池中

2.notify(): 喚醒線程池中的一個線程(任意)

3.botifyAll():喚醒線程池中的所有線程

class Resource

{

String name;

int age;

boolean flag = false;

}

class Input implements Runnable

{

Resource r;

Input(Resource r)

{

this.r = r;

}

public void run()

{

int x = 0;

while(true)

{

synchronized(r)

{

if(r.flag)

try {

r.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(x==0)

{

r.name = "臠割";

r.age = 18;

}

else

{

r.name = "弟鴿";

r.age = 17;

}

r.flag = true;

r.notify();

}

x = (x+1)%2;

}

}

}

class Output implements Runnable

{

Resource r = new Resource();

Output(Resource r)

{

this.r = r;

}

public void run()

{

while(true)

synchronized(r)

{

if(!r.flag)

try {

r.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(r.name+"--->"+r.age);

r.flag = false;

r.notify();

}

}

}

public class ResourceDemo {

public static void main(String[] args) {

Resource r = new Resource();

Input in = new Input(r);

Output out = new Output(r);

Thread t1 = new Thread(in);

Thread t2 = new Thread(out);

t1.start();

t2.start();

}

}

線程的wait();notify();notifuAll()定義在Oblect類中的原因是:

因為這些方法是監視器的方法,監視器其實就是鎖。

鎖可以是任意的對象,任意的對象調用的方式一定定義在Object類中

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

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

相關文章

scala中:: , +:, :+, :::, +++的區別

原文鏈接&#xff1a;https://segmentfault.com/a/1190000005083578 ------------------------------------------------------------- 4種操作符的區別和聯系 :: 該方法被稱為cons&#xff0c;意為構造&#xff0c;向隊列的頭部追加數據&#xff0c;創造新的列表。用法為 x::…

python包管理機制_Go 1.5之前的多種包管理機制簡介(

在 Go 語言中&#xff0c;我們可以使用go get命令安裝遠程倉庫中托管的代碼&#xff0c;不同于 Ruby Gem、pypi 等集中式的包管理機制&#xff0c; Go 語言的包管理系統是去中心化的。簡單來講&#xff0c;go get命令支持任何一個位置托管的 Git 或 Mercurial 的倉庫&#xff0…

nc命令簡介

nc介紹 ncat/nc 既是一個端口掃描工具&#xff0c;也是一款安全工具&#xff0c;還能是一款監測工具&#xff0c;甚至可以做為一個簡單的 TCP 代理。 在大多數 Debian 發行版中&#xff0c;nc 是默認可用的&#xff0c;它會在安裝系統的過程中自動被安裝。 但是在 CentOS 7 / R…

java時間日期工具類_java工具類--日期相關;

日期相關Date類1.通常使用的是java.util包2.導包 拿來使用 構建對象3.通常使用無參數的構造方法 或者帶long構造方法4.Date類中常用的方法before(); after();setTime() getTime()compareTo(); -1 1 0;5.可以處理一個Date類型的格式DateFormat類1.包java.text 需要導包使用2.此類…

/* compiled code */ ?

原因&#xff1a;這是所用的ide自帶了反編譯工具&#xff0c;反編譯的。不是具體的源碼 具體的源碼需要手動關聯源碼包

python判斷矩陣是否對稱_Python創建對稱矩陣的方法示例【基于numpy模塊】

本文實例講述了Python創建對稱矩陣的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;對稱(實對稱)矩陣也即&#xff1a;step 1&#xff1a;創建一個方陣>>> import numpy as np>>> X np.random.rand(5**2).reshape(5, 5)>>> Xarray([…

重新學習Ubuntu -- 截圖軟件的選擇和安裝

前面兩篇完成了&#xff1a;系統的安裝和系統安裝后的優化。 截圖軟件 shutterflameshot 這個根據自己原來的學習經驗和網上的相關資料來完成截圖軟件的安裝。參照文章&#xff1a; shutter :Ubuntu 18.04/LinuxMint 19中啟用Shutter編輯功能 flameshot:Flameshot&#xff1a;你…

Scala-Actor并行wordcount

scala-2.10.6 文件&#xff1a; "d://word.txt", "d://word.log" 文件內容&#xff1a; 代碼&#xff1a; package cn.zengmg.day26.actorimport scala.actors.{Actor, Future} import scala.collection.mutable.ListBuffer import scala.io.Sourcecase c…

小程序測試用例模板_微信小程序樣式:高質量小程序樣式模板大全

新手想要制作出美觀的小程序&#xff0c;你需要多參考一些好看的微信小程序樣式。今天就帶大家分析幾個高質量小程序的樣式&#xff0c;看看別是怎么把小程序做得美觀又吸引人的&#xff1a;1.電商小程序樣式電商小程序首頁一般是按照“圖片banner - 快捷按鈕 - 商品及分類”的…

Sql Server 2016數據庫生成帶數據的腳本

步驟&#xff1a;右鍵點擊對應數據庫->任務->生成腳本 在彈出的會話框中選擇需要的對象&#xff0c;點擊下一步&#xff0c;在設置和編寫腳本選項中&#xff0c;點開高級按鈕&#xff08;如圖&#xff09;選擇架構和數據點擊確定就可以了。 提醒&#xff1a;如果你在數據…

深入理解Scala的隱式轉換系統

原文鏈接&#xff1a;http://www.cnblogs.com/MOBIN/p/5351900.html----------------------------------------------摘要&#xff1a;通過隱式轉換&#xff0c;程序員可以在編寫Scala程序時故意漏掉一些信息&#xff0c;讓編譯器去嘗試在編譯期間自動推導出這些信息來&#xf…

python123輸出最大值_Python:運行另一列的最大值?

我有一個像這樣的數據幀&#xff0c;它跟蹤特定項(ID)的值隨時間的變化&#xff1a;mytimenp.tile( np.arange(0,10) , 2 )myidsnp.repeat( [123,456], [10,10] )myvaluesnp.random.random_integers(20,30,10*2)dfpd.DataFrame()df[myids]myidsdf[mytime]mytimedf[myvalues]myv…

Java連接MySQL

2019獨角獸企業重金招聘Python工程師標準>>> <1> 在navicat中創建一個MySQL連接&#xff0c;填寫連接名和密碼&#xff08;密碼為你配置MySQL設置的密碼&#xff09; <2> 在該連接中新建一個數據庫&#xff0c;填寫數據庫名。字符集選擇&#xff08;gb-…

ssm實訓報告心得_Java開發學習心得(一):SSM環境搭建

Java開發學習心得&#xff08;一&#xff09;&#xff1a;SSM環境搭建有一點.NET的開發基礎&#xff0c;在學校學過基礎語法&#xff0c;對JAVA有點興趣&#xff0c;就簡單學習了一下&#xff0c;記錄一下從哪些方面入手的&#xff0c;暫時不打算深入到原理方面&#xff0c;先簡…

Java中boolean類型占用多少個字節

原文地址&#xff1a;http://www.cnblogs.com/wangtianze/p/6690665.html?utm_sourceitdadao&utm_mediumreferral ----------------------- 為什么要問這個問題&#xff0c;首先在Java中定義的八種基本數據類型中&#xff0c;除了其它七種類型都有明確的內存占用字節數外…

java虛引用作用_深入理解Java中的引用(二)——強軟弱虛引用

深入理解Java中的引用(二)——強軟弱虛引用在上一篇文章中介紹了Java的Reference類&#xff0c;本篇文章介紹他的四個子類&#xff1a;強引用、軟引用、弱引用、虛引用。強引用(StrongReference)強引用是我們在代碼中最普通的引用。示例代碼如下&#xff1a;Object o new Obje…

SQL查詢表的列名

SELECT COLUMN_NAME FROM DBA_TAB_COLUMNS WHERE TABLE_NAME DT4_JOB_CHECK_MATRIX;SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME DT4_JOB_CHECK_MATRIX;SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME DT4_JOB_CHECK_MATRIX;

java老鳥123怎么樣_java入門123——一個老鳥的java學習心得.doc

java入門123——一個老鳥的java學習心得java入門123——一個老鳥的java學習心得篇一&#xff1a;java初學者學習心得學習Java心得體會學習了一學期的Java課程,覺得是該總結自己的心得體會了。開始學習任何一門課(包括java)&#xff0c;興趣最重要。一直覺得自己在學計算機編程語…

ruby 爬蟲爬取拉鉤網職位信息,產生詞云報告

思路&#xff1a;1.獲取拉勾網搜索到職位的頁數 2.調用接口獲取職位id 3.根據職位id訪問頁面&#xff0c;匹配出關鍵字 url訪問采用unirest&#xff0c;由于拉鉤反爬蟲&#xff0c;短時間內頻繁訪問會被限制訪問&#xff0c;所以沒有采用多線程&#xff0c;而且每個頁面訪問時間…

評論語義分析 分詞 分類python_用python調用ICTCLAS50進行中文分詞

直接上源碼吧tokenizer類&#xff1a;#_*_encoding:utf-8_*_from ctypes import *class tokenizer:def __init__(self):self._stext[、,“,”,&#xff0c;,。,《,》,&#xff1a;,&#xff1b;,!,‘,’,?,&#xff1f;,&#xff01;,, ,] #枚舉標點符號包括空格self._stopwor…