Javaee多線程之進程和線程之間的區(qū)別和聯(lián)系(最新整理)
進程和線程
進程
- 進程:是正在執(zhí)行的程序,是資源分配的基本單位,具有獨立的地址空間
- 操作系統(tǒng)會為其分配CPU和內(nèi)存
線程
- 線程:引入線程是為了解決進程開銷大,浪費資源的情景,并且多進程并發(fā)效率比較低
- 線程是調(diào)度執(zhí)行的基本單位
- 線程之間會相互影響,一個線程掛了,會影響到整個進程都異常結(jié)束,線程也自然會結(jié)束
進程和線程的區(qū)別
- 進程包含線程,一個進程里面有多個線程或者是一個線程
- 進程和線程都是用來實現(xiàn)并發(fā)編程場景的,但是線程比進程更輕量和高效
- 同一個進程的線程之間共用同一份資源(內(nèi)存和硬盤),省去了申請資源的開銷
- 進程和進程之間都是獨立存在的,不會相互影響,同一個進程中,線程和線程之間會相互影響(線程安全問題 + 線程出現(xiàn)異常)
- 進程是分配資源的基本單位,線程是調(diào)度執(zhí)行的基本單位
創(chuàng)建線程的五種寫法
繼承Thread,重寫run
package Thread;
class MyThread extends Thread{
public void run(){
// 這個是線程的入口方法
while(true) {
System.out.println("hello Thread!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
// 創(chuàng)建線程
public class Demo1 {
public static void main(String[] args) throws InterruptedException {
Thread thread = new MyThread();
// 使用start方法可以間接調(diào)用run方法
// start和 run都時Thread的成員
// run 只是線程的入口(描述了線程要做什么事情)
// start才是真正調(diào)用了系統(tǒng)的API,在系統(tǒng)中創(chuàng)建出了線程,讓線程調(diào)用 run
thread.start();
// 從這句開始程序就并發(fā)執(zhí)行,一邊執(zhí)行hello main,一邊執(zhí)行hello Thread
// 兵分兩路進行執(zhí)行
// 并發(fā) == 并行 + 并發(fā)
while(true){
System.out.println("hello main!");
Thread.sleep(1000);
}
// 先執(zhí)行main,再執(zhí)行的是Thread,先執(zhí)行主線程
}
}實現(xiàn)Runnable(接口),重寫run
package Thread;
class MyRunable implements Runnable{
public void run(){
while(true){
System.out.println("hello thread!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Demo2 {
public static void main(String[] args) throws InterruptedException {
// 這個接口就是用來實現(xiàn)多態(tài)的
Runnable myRunable = new MyRunable();
Thread thread = new Thread(myRunable);
thread.start();
while(true){
System.out.println("hello main!");
Thread.sleep(1000);
}
}
}繼承Thread,重寫run,但是使用匿名內(nèi)部類
- 使用匿名內(nèi)部類的方式創(chuàng)建出線程
package Thread;
public class Demo3 {
public static void main(String[] args) {
Thread thread = new Thread(){
public void run(){
while(true){
System.out.println("hello Thread!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
};
thread.start();
while(true){
System.out.println("hello main!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}實現(xiàn)Runnable(接口),重寫run,但是使用匿名內(nèi)部類
package Thread;
public class Demo4 {
public static void main(String[] args) {
// 法一:創(chuàng)建實例
Runnable runnable = new Runnable(){
public void run(){
System.out.println("hello Thread!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
};
// 法二:創(chuàng)建匿名對象
Thread thread = new Thread(new Runnable(){
public void run(){
System.out.println("hello Thread!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
// Thread thread = new Thread(runnable);
thread.start();
while(true){
System.out.println("hello main!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}使用lambda表達式
- lambda表達式相當于是匿名內(nèi)部類的替換寫法
package Thread;
public class Demo5 {
public static void main(String[] args) {
Thread thread = new Thread(()->{
while(true){
System.out.println("hello Thread!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
thread.start();
while(true){
System.out.println("hello main!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}請說明Thread類中run和start的區(qū)別
從方法的區(qū)別,及運行結(jié)果的區(qū)別分別說明
1. start方法可以用來啟動一個新的線程,run方法只是一個普通的方法,在主線程中執(zhí)行
2.start方法只能調(diào)用一次,run方法可以調(diào)用多次
3.調(diào)用start方法會執(zhí)行新的線程,新線程和主線程并發(fā)執(zhí)行,run方法只是線程的入口,start方法調(diào)用了系統(tǒng)API,start方法創(chuàng)建出了線程,讓線程再調(diào)用run方法
4.run方法和主線程同步執(zhí)行,start方法啟動的線程和主線程異步執(zhí)行
5.run方法按順序執(zhí)行,start方法調(diào)用的線程中的代碼執(zhí)行順序由線程調(diào)度器決定,順序不確定
到此這篇關(guān)于Javaee多線程之進程和線程之間的區(qū)別和聯(lián)系(最新整理)的文章就介紹到這了,更多相關(guān)java進程和線程區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Flyway實現(xiàn)數(shù)據(jù)庫的初始化和版本管理操作
Flyway?是一款開源的數(shù)據(jù)庫版本管理工具,它可以很方便的在命令行中使用,或者在Java應用程序中引入,用于管理我們的數(shù)據(jù)庫版本,這篇文章主要介紹了SpringBoot整合Flyway實現(xiàn)數(shù)據(jù)庫的初始化和版本管理,需要的朋友可以參考下2023-06-06
java 獲取HttpRequest Header的幾種方法(必看篇)
下面小編就為大家?guī)硪黄猨ava 獲取HttpRequest Header的幾種方法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
關(guān)于通過java調(diào)用datax,返回任務執(zhí)行的方法
今天小編就為大家分享一篇關(guān)于通過java調(diào)用datax,返回任務執(zhí)行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Java使用Lambda表達式實現(xiàn)排序功能的實現(xiàn)代碼
在 Java 中使用 Lambda 表達式進行排序是一種簡潔且功能強大的方式,特別是在對集合中的對象進行自定義排序時,Lambda 表達式可以與 Collections.sort() 或 List.sort() 方法結(jié)合使用,本文給大家介紹了Java使用Lambda表達式實現(xiàn)排序功能的方法,需要的朋友可以參考下2025-07-07

