Java 中的進程與線程的實現

了解進程與線程:
進程:
當一個程序進入內存運行時,即變成一個進程。進程是處于運行過程 中的程序,并且具有一定的獨立功能,進程是系統進行資源分配和調度的一個獨立單 位一般而言,進程包含如下三個特征:

  • 獨立性:進程是系統中獨立存在的實體,它可以擁有自己獨立的資源,每一個進程都擁有自己私有的地址空間。在沒有經過進程本身允許的情況下,一個用戶進程不可以直接訪問其他進程的地址空間。
  • 動態性:進程與程序的區別在于,程序只是一個靜態的指令集合,而進程是一個 正在系統中活動的指令集合。在進程中加入了時間的概念。進程具有自己的生命 周期和各種不同的狀態,這些概念在程序中都是不具備的。
  • 并發性:多個進程可以在單個處理器上并發執行,多個進程之間不會互相影響。

線程:

多線程擴展了多進程的概念,使得同一個進程可以同時并發處理多個任務。線程 (Thread)也被稱作輕量級進程(Lightweight Process),線程是進程的執行單元。 就像進程在操作系統中的地位一樣,線程在程序中是獨立的、并發的執行流。當進程被初始化后,主線程就被創建了。對于絕大多數的應用程序來說,通常僅要求有一個主線程,但也可以在該進程內創建多條順序執行流,這些順序執行流就是線程,每個線程也是互相獨立的。
線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父進程。 線程可以擁有自己的堆棧、自己的程序計數器和自己的局部變量,但不擁有系統資源,它與父進程的其他線程共享該進程所擁有的全部資源。因為多個線程共享父進程里的全部資源,因此編程更加方便;但必須更加小心,因為需要確保線程不會妨礙同 一進程里的其他線程線程可以完成一定的任務,可以與其他線程共享父進程中的共享 變量及部分環境,相互之間協同來完成進程所要完成的任務。
簡潔來說:
操作系統可以同時執行多個任務,每個任務就是進程;進程可以同時執行多個 任務,每個任務就是線程。

Java 語言中主要兩種實現線程的方式:

  • 繼承Thread類創建線程類
  • 實現Runnable接口創建線程類

一.繼承Thread類創建線程類
實現步驟:
? 定義類繼承Thread類,并重寫Thread類的run()方法,該run()方法的方法體就代表了線程需要完成的任務。因此把run()方法稱為線程執行體。
? 創建Thread 子類的實例,即創建了線程執行體。
? 調用線程對象的start() 方法來啟動該線程。
如下示例:


public class ExtendsThreadDemo {public static void main(String[] args) {MyThread1 myThread1 = new MyThread1();MyThread1 myThread12 = new MyThread1();// 調用start方法方可啟動線程// 不能調用run()方法,run方法只是thread的一個普通方法,還是在主線程里執行。//啟動線程myThread1.start();myThread12.start();		}
}//繼承Thread類創建線程類 繼承Thread類,重寫run方法
class MyThread1 extends Thread{@Overridepublic void run() {System.out.println("線程id--"+ getId());System.out.println("線程名稱--"+ getName());for (int i = 0; i < 10; i++) {System.out.println("線程id:"+getId()+" "+i);}}	
}

你會發現線程的執行順序不太固定,是沒有固定順序的,結果示例:
在這里插入圖片描述
二.實現Runnable 接口創建線程類
實現步驟:
? 定義類實現Runnable接口,并重寫Runnable接口的run()方法,該run()方法的 方法體就代表了線程需要完成的任務。
? 創建Runnable實現類的實例,并以此實例作為Thread的target來創建Thread對象,該Thread對象才是真正的線程對象。
? 用該Thread對象的start()方法來啟動該線程。
如下示例:

public class RunnableThreadDemo {public static void main(String[] args) {//創建Runnable實現類的實例MyThread2 myThread2= new MyThread2();//創建Thread類,并把Runnable實現類的實例作為參數Thread thread1 = new Thread(myThread2);//傳入一個Runnable 的實現類Thread thread2 = new Thread(myThread2);//啟動線程thread1.start();thread2.start();}
}class MyThread2 implements Runnable{@Overridepublic void run() {// 實現Runnable接口的,無法直接使用getId(),getName()等方法// 需要使用Thread.currentThread() 來獲取到當前對象才行System.out.println("線程id--"+ Thread.currentThread().getId());System.out.println("線程名稱--"+ Thread.currentThread().getName());for (int i = 0; i < 10; i++) {System.out.println("線程id:"+ Thread.currentThread().getId()+"  "+i);}}	
}

結果如下:
在這里插入圖片描述

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

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

相關文章

Java集合工具類:Collections

Java提供了一個操作Set、List和Map等集合的工具類&#xff1a;Collections&#xff0c;該工具類里 提供了大量方法對集合元素進行排序、查詢和修改等操作&#xff0c;還提供了對集合對象實現同步控制等方法。 一、 排序操作 如下示例&#xff1a; public class CollectionsSor…

Java異常處理throws/throw

Java的異常被分為兩大類&#xff1a;Checked異常和Runtime異常&#xff08;運行時異常&#xff09;。 ? Runtime異常&#xff1a;所有的RuntimeException類及其子類的實例&#xff1b; ? Checked異常&#xff1a;不是RuntimeException類及其子類的異常實例。 只有Java語言提供…

JDBC 連接MYSQL數據庫

1. 加載驅動 Class.forName("com.mysql.jdbc.Driver");com.mysql.jdbc 包名 Driver 驅動名&#xff0c;驅動包需要引入進來 mysql com.mysql.jdbc.Driveroracle oracle.jdbc.driver.OracleDriversqlserver com.microsoft.sqlserver.jdbc.SQLServerDriver …

JSP 之輸出九九乘法表

JSP是一種建立在Servlet規范提供的功能之上的動態網頁技術&#xff0c;允許在網頁文件中嵌入java代碼和jsp標記。Java 服務器頁面 (Java Server Page &#xff0c;JSP) 擴展名為 .jsp。 1&#xff0e;jsp的執行過程 Jsp文件在用戶第一次請求時,會被編譯成Servlet,然后由這個Se…

Java 重寫與重載

方法的重寫&#xff1a; 重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。 重寫的好處在于子類可以根據需要&#xff0c;定義特定于自己的行為。 也就是說子類能夠根據需要實現父類的方法。 重寫方法不能拋出新的檢查異常或者比被重寫方法申…

Java新增

在實踐項目中我們有可能需要做到新增功能&#xff0c;新增一張表&#xff0c;或是新增多張表。這里我新增的是一張表。 這里主要描述DAO層與Servlet 層&#xff1a; DAO 層&#xff1a; public class UserDaoImpl implements UserDao {private Connection con null;private P…

JSP根據狀態動態改變數據表格按鈕

有時候在開發的過程中會遇到需要根據狀態ID 來動態改變數據表格的按鈕&#xff0c;下面我主要講述兩種表格根據ID改變按鈕的方式。 下面這種我是用EL 表達式獲取表格中的值&#xff1a; <table class"table table-striped table-bordered table-hover" id"s…

Java 模糊查詢

在學習Java 這門語言過程中&#xff0c;會遇到無數的知識點與錯誤&#xff0c;最重要的是我們能夠在茫茫的代碼中找到突破口&#xff0c;并用心去汲取精華。 在很多時候我們會用到模糊查詢&#xff0c;這里是我在編碼過程中用到的模糊查詢。 JSP &#xff1a; <input value…

Java刪除表

Java刪除表 這里頁面我用了layui 框架做刪除的&#xff0c;這里需要引入layui 的css 與js 插件&#xff0c;這里寫出主要的代碼。 Jsp &#xff1a; //監聽行工具事件table.on(tool(test), function(obj){var data obj.data; //獲得當前行數據var date1 data.classifyColum…

原始分頁

Jsp &#xff1a; <div style"float: right;">當前為${currentPage}頁&#xff0c;共有${totalRow}條數據&#xff0c;共${totalPage}頁 <select style"border-radius: 18px;" id"pageSize" name"pageSize" onchange"c…

根據銀行卡號判斷銀行卡是否正確與歸屬銀行

校驗過程&#xff1a; 1.從卡號的最后一位數字開始&#xff0c;逆向將奇數位&#xff08;1&#xff0c;3&#xff0c;5 等等相加&#xff09; 2.從卡號最后一位數字開始&#xff0c;逆向將偶數位數字&#xff0c;先乘以2&#xff0c;如果乘積為兩位數&#xff0c;將個位數字相加…

根據年月日判斷第多少天,星期幾

1. 根據年月日判斷第多少天 Scanner是SDK1.5新增的一個類,可使用該類創建一個對象。 Scanner scannernew Scanner(System.in);  然后scanner對象調用下列方法&#xff08;函數&#xff09;,讀取用戶在命令行輸入的各種數據類型   next.Byte(),nextDouble(),nextFloat,nextIn…

解決MySQLyog 導入數據庫文件沒有反應

之前我在MySQL 中新建了一個數據庫&#xff0c;名為“onlineclassroom” 的數據庫&#xff0c;但是在將外部的.sql 文件導入進來之后發現&#xff0c;數據庫沒有反應&#xff0c;也看不到表數據&#xff0c;以為是沒有刷新問題&#xff0c;但是刷新之后發現還是沒有這個就很奇怪…

解決myeclipse報錯500,MySQLyog報錯誤碼問題

在myeclipse 寫了一個登錄&#xff0c;但在我登錄的時候卻報了500的空指針&#xff0c;我檢查了自己的登錄代碼&#xff0c;發現沒有問題&#xff0c;這不應該啊&#xff0c;然后在網上也尋找了一些解決方案&#xff0c;發現好像并不適用&#xff0c;500空指針如下&#xff1a;…

Java防止用戶同一時間重復登錄(包括異地登錄)

有時候我們在做登錄模塊過程中難免會遇到這種問題&#xff0c;即使我們給用戶進行了多重判斷&#xff0c;比如&#xff1a;用戶名&#xff0c;管理員&#xff0c;驗證碼&#xff0c;一系列的判斷… 你是否真正考慮到用戶的體驗&#xff0c;比如不能讓用戶在同一時間&#xff0c…

jquery點擊彈出播放視頻并顯示遮罩層

最近在做視頻播放的時候&#xff0c;發現用jquery的播放視頻可以很好的實現我所需要的效果。在之前請把插件引用進來&#xff0c;廢話不多說&#xff0c;代碼如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><meta …

JS實現圖片循環滾動

之前在前端的時候有遇到這樣一個問題&#xff0c;實現 JS 圖片的循環滾動&#xff0c;然后鼠標移入的時候停止滾動&#xff0c;鼠標移開繼續滾動&#xff0c;這里無非就是設置了一個定時器&#xff0c;鼠標移上時清除定時器達到滾動停止的目的&#xff0c;鼠標移開時重設定時器…

有趣的滾動條

今天在搭前端頁面的時候&#xff0c;UI給過來的一個自定義的滾動條&#xff0c;要求必須與設計的一樣&#xff0c;覺得有點有趣&#xff0c;現在記錄一下。 效果圖&#xff1a; 具體代碼是這樣的&#xff1a; /*字體太長&#xff0c;這里我就減少一些*/ <div class"l…

查詢分頁的幾種sql語句

sql server 中的分頁查詢sql語句不跟mysql 一樣&#xff0c;mysql 用 limit 可以實現查詢sql分頁。如&#xff1a; select * from news where id>(select id from news limit 250000,1) limit 10; //相對執行效率高 select * from news limit 250000,10;mysql 中 limit總是…

c#解決在數據表格中無法顯示秒數問題

在查詢日期的時候&#xff08;年月日時分秒&#xff09;&#xff0c;發現丟失了秒&#xff0c;在這里我用的是自己 封裝的Vo類里面的時間轉換&#xff0c;沒有把秒數查詢出來&#xff0c;在Vo動不了手&#xff0c;我還不能對Controller 動手了&#xff1f; 查詢&#xff1a; 更…