今天就跟大家聊聊有關java 中多線程的原理是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
程序、進程、線程
程序(program)是為完成特定任務、用某種語言編寫的一組指令的集 合。即指一段靜態的代碼,靜態對象。
進程(process)是程序的一次執行過程,或是正在運行的一個程序。是 一個動態的過程:有它自身的產生、存在和消亡的過程——具有生命 周期??梢岳斫鉃橐粋€正在運行的軟件。
線程(thread),進程可進一步細化為線程,是一個程序內部的一條執行 路徑??梢岳斫鉃橐粋€軟件的功能。
多線程程序的優點:
提高應用程序的響應。對圖形化界面更有意義,可增強用戶體驗。
提高計算機系統CPU的利用率。
改善程序結構。將既長又復雜的進程分為多個線程,獨立運行,利于理 解和修改。
在Java中我們可以使用java.lang.Thread類來實現 ,要想我們的類具有多線程的功能,需要讓我們的類去繼承Thread類,然后重寫run()方法,并調用 start()方法來啟動多線程。
示例 1:
public class MyThread extends Thread{ public void run(){ for (int i = 0; i < 50; i++) { System.out.println("MyThread:"+i); } } } public class MyThreadTest{ public static void main(String[] args){ Thread t1 = new MyThread(); t1.start(); for (int i = 0; i < 20; i++) { System.out.println("world=====" + i); } } }
說明:創建一個Java類繼承Thread類,并重寫父類Thread中的run方法,在run方法中寫具體的多線程業務。創建線程類的對象,并調用start方法啟動多線程。
**注意:**多線程的啟動調用的是start方法,在jvm底層中start方法內部會調用run方法。
一個對象只需要調用一次start()方法,如果多次調用則會拋出異?!癐llegalThreadStateException”。
示例 2:
public class MyRunnable implements Runnable { public void run() { for (int i = 0; i < 50 ; i++) { System.out.println( "MyRunnable:"+i); } } } public class ThreadDemo { public static void main(String[] args) { Thread thread = new Thread( new MyRunnable()); thread.start();// 只有調用Thread類中的start()方法才可以實現多線程 for (int i = 0; i < 50; i++) { System.out.println("main:" + i); } } }
說明:
編寫一個類,實現Runnable接口;
重寫run()方法;
根據Runnable子類對象來創建Thread對象;
通過Thread對象調用start()方法來啟動多線程;
總結:
繼承Thread:重寫run()方法,業務代碼在run()中。
實現Runnable:線程代碼存在接口的子類的run方法。
通過Callable和線程池的方式創建線程。
**提示:**在應用中我們如果可以使用Runable接口那么就盡量使用,這樣可以避免Java單繼承的局限。
1)currentThread():返回當前正在執行的線程對象的引用。
2)getName():返回當前線程的名稱
3)isAlive():判斷當前線程是否存活
4)isDeaomon():判斷線程是否為守護線程
5)join():在當前線程中引入另一個線程,而當前線程會被阻塞
6)sleep():讓當前線程進入睡眠狀態
7)yield():讓當前線程放棄CPU的執行權,重新進入排隊,與其他線程平等爭奪CPU執行。
8)interrupt() 中斷線程 9)interrupted() 如果當前線程已經中斷,則返回 true;否則返回 false。
示例:
public class ThreadTest { public static void main(String[] args) { //創建線程并開啟線程1 Thread thread = new MyThread(); thread.start(); //創建線程并開啟線程2 Thread thread1 = new Thread(new MyRunnable()); thread1.start(); //創建線程并開啟線程3 MyCallable myCallable = new MyCallable(); FutureTask futureTask = new FutureTask(myCallable); new Thread(futureTask).start(); for (int i = 0; i < 100; i++) { if (i== 50){ //在main線程中當i=50加如thread線程,會在thread執行完后才會繼續執行main線程剩下的 try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("main:"+i); } } } public class MyThread extends Thread{ public void run(){ for (int i = 0; i < 100; i++) { // void interrupt() 中斷線程 可以理解為線程中斷狀態有 true | false,每一次調用就是修改狀態為true //static boolean interrupted() 如果當前線程已經中斷,則返回 true;否則返回 false。 Thread.currentThread().interrupt(); if (Thread.interrupted()){ System.out.println("Thread interrupted"); } // static currentThread() 返回對當前正在執行的線程對象的引用 //String getName() 返回該線程的名稱。 //Thread.currentThread().getName() 獲取當前線程對象的名稱 System.out.println(Thread.currentThread().getName()+":"+i); } } } public class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("MyRunnable"+i); //每次執行完打印讓線程休眠1秒 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class MyCallable implements Callable { @Override public Object call() throws Exception { for (int i = 0; i < 100; i++) { System.out.println("MyCallable:"+i); } return null; } }
看完上述內容,你們對java 中多線程的原理是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。