Thread的定義與常用方法
Thread初探
前言
以前大家寫的都是單一執行緒的程序,全是在main函數中呼叫方法,可以清楚的看到它的效率是特別低的,就像python中使用單線程取爬一個網站,可以說能讓你等的吐血,因為數據量實在太大了,今天我們就來看看java的並發編程多線程的學習
建立執行緒
建立一個執行緒可以有多種方法,例如繼承Thread類,實作Runnable介面......下面我們來詳細的看看所建立的方法
繼承Thread
為什麼繼承
Thread
可以直接呼叫start()
方法啟動執行緒呢,因為start()
本身就是Thread的方法,也就是繼承了Thread的start()方法,因此這個類別的物件可以呼叫start()啟動執行緒
//继承Threadpublic class MyThread extends Thread { public void run() {for (int i = 0; i < 10; i++) { System.out.println(this.getName()+"正在跑"); } } }public class Test{public static void main(String[] args) { Mythread t1=new MyThread(); //创建对象t1.start(); //启动线程} }
注意: 繼承
Thread
類的創建方法一個對像只能創建一個線程,並不能多個線程共用一個對象,只能一個線程對應一個對象,因此讓我們來看看實作Runnable
介面的類別來實作多個執行緒共用同一個物件
#實作Runnable介面
//实现Runnable接口public class Demo implements Runnable { @Overridepublic void run() {for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"正在跑"); } } }//测试类public class Test{public static void main(String[] args) { Demo d=new Demo(); //创建对象Thread thread1=new Thread(d); //为对象创建一个线程Thread thread2=new Thread(d); //创建另外一个线程//同时启动两个线程thread1.start(); thread2.start(); } }
從上面可以清楚的看到實作
Runnable
介面的類別一個物件可以供多個執行緒共享,不像繼承Thread類別只為一個執行緒使用
簡單的創建方法
直接在
main
方法中創建,如果創建的普通類別的物件在外面,那麼必須是final修飾,可以實現多個執行緒同時共享一個對象,這個和實作Runnable
介面一樣,這時候就要控制同步條件了,如果在run方法中定義對象,那麼,就是一個執行緒對應一個物件,這個就和繼承Thread類別一樣的效果。所以可以依條件自由選擇
//普通的一个类public class Simple {public void display() {for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"正在跑"); } } }//线程测试类public class Test {public static void main(String[] args) { //如果在外面必须使用final,当然也可以直写在run方法中,不过写在外面可以实现多个线程共享一个对象//写在run方法中当前对象只能为一个线程使用,和继承Thread类一样的效果final Simple simple=new Simple(); //下面创建使用同一个对象创建同两个线程,实现多个线程共享一个对象,和实现Runnable接口一样的效果Thread t1=new Thread(){public void run() { simple.display(); }; }; Thread t2=new Thread(){public void run() { simple.display(); }; }; //启动这两个线程t1.start(); t2.start(); }}
常用的方法
static void sleep(long mils)
使正在運行的執行緒休眠mils毫秒,但這裡需要注意的是如果執行緒加了鎖,那麼使執行緒休眠並不會釋放鎖定
String getName()
得到執行緒的名稱,上面的程式已經使用了這個方法
void setName(String name)
設定正在執行的執行緒的名字為name
##start()
啟動線程,線程的創建並不意味著線程的啟動,只有呼叫start()方法線程才是真正的開始運行
long getId()
傳回執行緒的識別碼
使用
run()
執行緒執行的程式碼都放在run()方法中,在run方法中的呼叫是有順序的,都是依照程式執行的順序開始執行
以下使用上面的方法建立一個實例#
//线程的类,继承Threadpublic class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try {this.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) { e.printStackTrace(); } } } }//线程测试的类public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字MyThread1 t2 = new MyThread1(); t2.setName("第二个线程"); t1.start(); // 启动线程,开始运行t2.start(); } }
使用
void join()
等待該執行緒終止才能執行其他的執行緒
void join(long mils)
等待該執行緒的時間為mils毫秒,一旦過了這個時間其他執行緒正常執行
//线程类public class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try {this.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) { e.printStackTrace(); } } } }//测试类public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字t1.start(); // 启动线程,开始运行try { t1.join(); //阻塞其他线程,只有当这个线程运行完之后才开始运行其他的线程} catch (InterruptedException e) { e.printStackTrace(); }for (int i = 0; i < 10; i++) { System.out.println("主线程正在运行"); } } }//输出结果/*Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9Thread-Name: 第一个线程 Thread-id: 9主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行主线程正在运行 */
使用
得到目前執行緒優先權
# #getPriority()
改變執行緒的優先權(0-10)預設的是5,優先權越高取得cpu資源的幾率就會越高
#setPriority(int num)
//线程类public class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try {this.sleep(1000); // 线程休眠1秒} catch (InterruptedException e) { e.printStackTrace(); } } } }//测试类public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字MyThread1 t2 = new MyThread1(); t2.setName("第二个线程"); t2.setPriority(8); //设置第二个线程的优先级为8,第一个线程的优先级为5(是默认的)t1.start(); t2.start(); } }/* * 从上面的运行结果可以看出大部分的第二个线程都是在第一个线程之前开始执行的,也就是说优先级越高获得cpu执行的几率就越大 * /
##使用
//测试类public class MyThread1 extends Thread {public void run() { // 重载run方法,并且在其中写线程执行的代码块for (int i = 0; i < 10; i++) {// 获取线程的id和nameSystem.out.println("Thread-Name: " + this.getName() + " Thread-id: " + this.getId());try { Thread.sleep(1000); //休眠一秒,方便主线程运行结束} catch (InterruptedException e) { e.printStackTrace(); } } } }public class Test {public static void main(String[] args) { MyThread1 t1 = new MyThread1(); // 创建线程t1.setName("第一个线程"); // 设置线程的名字t1.setDaemon(true); t1.start();for (int i = 0; i < 1; i++) { System.out.println(i); } } }//结果:/* 0123456789Thread-Name: 第一个线程 Thread-id: 9*//* * 从上面的结果可以看出,一旦主线程结束,那么守护线程就会自动的结束 *登入後複製- #setDaemon(boolean) 是否設定為守護線程,如果設定為守護線程,那麼主線程銷毀守護線程也會隨之銷毀 isDaemon ()
判斷是否為守護執行緒
#########使用######rrreee#####################rrreee############
以上是Thread的定義與常用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java爬蟲初探:了解它的基本概念與用途,需要具體程式碼範例隨著網路的快速發展,取得並處理大量的資料成為企業和個人不可或缺的一項任務。而爬蟲(WebScraping)作為一種自動化的數據獲取方法,不僅能夠快速地收集網路上的數據,還能夠對大量的數據進行分析和處理。在許多資料探勘和資訊檢索專案中,爬蟲已經成為非常重要的工具。本文將介紹Java爬蟲的基本概

在java中可有兩種方式實作多線程,一種是繼承Thread類,一種是實作Runnable介面;Thread類別是在java.lang套件中定義的。一個類別只要繼承了Thread類別同時覆寫了本類別中的run()方法就可以實作多執行緒運算了,但是一個類別只能繼承一個父類,這是此方法的限制。以下看範例:packageorg.thread.demo;classMyThreadextendsThread{privateStringname;publicMyThread(Stringname){super();this

使用Java的Thread.start()函數啟動新執行緒在Java中,我們可以使用多執行緒來實作並發執行多個任務。 Java提供了Thread類別來建立和管理執行緒。 Thread類別中的start()函數用於啟動一個新線程,並執行該線程的run()方法中的程式碼。程式碼範例:publicclassMyThreadextendsThread{@Overr

在java中,說到線程,Thread是必不可少的。執行緒是一個比過程更輕的調度執行器。為什麼要使用線程?透過使用線程,可以將作業系統過程中的資源分配和執行調度分開。每個執行緒不僅可以共享過程資源(記憶體位址、檔案I/O等),還可以獨立調度(執行緒是CPU調度的基本單位)。說明1、Thread是製作線程最重要的類,這個字本身也代表線程。 2.Thread類別實作了Runnable介面。實例publicclassThreadDemoextendsThread{publicvoidrun(){for(inti=0

理解SpringMVC:初探這個框架的本質,需要具體程式碼範例引言:SpringMVC是一種基於Java的Web應用開發框架,它採用了MVC(Model-View-Controller)的設計模式,提供了一種靈活、可擴展的方式來建立Web應用程式。本文將介紹SpringMVC框架的基本工作原理和核心組件,並結合實際程式碼範例來幫助讀者更好地理解這個框架的本

有使用者反映,在安裝了微軟3月份的Win11更新修補程式KB5035853後,出現了藍色畫面死機錯誤,其中系統頁面顯示「ThreadStuckinDeviceDriver」。據了解,這種錯誤可能是由硬體或驅動程式問題引起的。以下是五種修復方法,希望能夠快速解決電腦藍色畫面問題。方法一:執行系統檔案檢查在指令提示字元中執行【sfc/scannow】指令,可用來偵測和修復系統檔案的完整性問題。這個命令的作用是掃描並修復任何缺失或受損的系統文件,有助於確保系統的穩定性和正常運作。方法二:1.下載並開啟“藍色畫面修復工具”

iPhone15Pro和iPhone15ProMax支援Thread網狀網路協定。 Thread網路技術被列為Pro型號的新功能,但不包括在iPhone15和iPhone15Plus。蘋果表示,iPhone15Pro是第一款具有Thread收音機的智慧型手機,可用於直接控制支援Thread的智慧家庭產品。 Thread之前已被加入到HomePodmini和AppleTV中,但沒有其他Apple設備具有Thread連接功能。在iPhone15Pro型號的新聞稿中,Apple解釋說,Thread為「家庭

Java使用Thread類別的start()函數啟動一個新的執行緒在Java中,多執行緒是一種並發執行的方式,可以同時執行多個任務。為了實現多線程,在Java中提供了Thread類,透過Thread類別來建立和控制線程。其中,start()函數是用來啟動一個新的執行緒。 start()函數的作用是讓執行緒進入就緒狀態,並自動呼叫執行緒的run()方法。當線程呼叫start(
