最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 線程池+分布式實(shí)現(xiàn)代碼

 更新時(shí)間:2025年09月28日 15:16:56   作者:啊退  
在 Java 開發(fā)中,"池" 通過預(yù)先創(chuàng)建并管理一定數(shù)量的資源,避免頻繁創(chuàng)建和銷毀資源帶來的性能開銷,從而提高系統(tǒng)效率,這篇文章主要介紹了Java 線程池+分布式實(shí)現(xiàn)代碼,需要的朋友可以參考下

1. 線程池

在 Java 開發(fā)中,"池" 通過預(yù)先創(chuàng)建并管理一定數(shù)量的資源,避免頻繁創(chuàng)建和銷毀資源帶來的性能開銷,從而提高系統(tǒng)效率。常見的池包括:

  • 線程池:管理線程資源,避免頻繁創(chuàng)建線程
  • 字符串常量池:緩存字符串,減少內(nèi)存占用
  • 連接池:管理數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)連接等

核心思想:用一個(gè)集合來維護(hù)固定大小或可配置的資源,當(dāng)需要使用資源時(shí)從池中獲取,使用完畢后歸還給池,而不是直接銷毀。

1.1 自定義線程池實(shí)現(xiàn)

1.1.1 線程池核心

PoolInit:線程池初始化和任務(wù)管理

ThreadPool:線程池核心類,管理工作線程

WorkThread:工作線程類,執(zhí)行具體任務(wù)

1.1.2 代碼示例

1.1.2.1 PoolInit
package com.lj.demo5;
import java.util.LinkedList;
import java.util.Scanner;
/**
 * 多線程與集合綜合應(yīng)用示例
 * 演示線程池的初始化和任務(wù)提交過程
 * 
 * 應(yīng)用場(chǎng)景:
 * 如QQ聊天服務(wù)器,面對(duì)大量用戶連接時(shí),
 * 使用線程池管理線程資源比為每個(gè)用戶創(chuàng)建新線程更高效
 */
public class PoolInit {
	// 存儲(chǔ)待執(zhí)行任務(wù)的鏈表,作為任務(wù)隊(duì)列
	public static LinkedList<String> linkTaskName = new LinkedList<String>();
	// 線程池實(shí)例
	public static ThreadPool t;
	public PoolInit() {
		// 初始化線程池,指定核心線程數(shù)為3
		t = new ThreadPool(3);
		// 從控制臺(tái)接收任務(wù)并提交給線程池
		Scanner scanner = new Scanner(System.in);
		String taskName = "";
		while (true) {
			System.out.println("請(qǐng)輸入線程需要處理的任務(wù)名稱:");
			taskName = scanner.next();
			// 將任務(wù)添加到任務(wù)隊(duì)列
			linkTaskName.add(taskName);
			// 提交第一個(gè)任務(wù)給線程池執(zhí)行
			t.executeTask(linkTaskName.get(0));
		}
	}
	public static void main(String[] args) {
		// 啟動(dòng)線程池
		new PoolInit();
	}
}

LinkTaskName:使用 LinkedList 作為任務(wù)隊(duì)列,存儲(chǔ)待執(zhí)行的任務(wù),構(gòu)造方法中初始化線程池,并通過控制臺(tái)接收用戶輸入的任務(wù),每當(dāng)有新任務(wù)輸入,先添加到任務(wù)隊(duì)列,再提交給線程池執(zhí)行。

1.1.2.2 ThreadPool
package com.lj.demo5;
import java.util.Vector;
/**
 * 線程池核心類
 * 管理工作線程,負(fù)責(zé)任務(wù)的分配與調(diào)度
 */
public class ThreadPool {
	// 線程池大小
	private int num;
	// 存儲(chǔ)工作線程的集合,使用Vector保證線程安全
	Vector<Runnable> vectors ;
	/**
	 * 構(gòu)造方法,初始化線程池
	 * @param num 線程池中的線程數(shù)量
	 */
	public ThreadPool(int num) {
		this.num = num;
		// 初始化線程集合,容量為指定的線程數(shù)量
		this.vectors = new Vector<Runnable>(this.num);
		System.out.println("線程集合當(dāng)前大?。? + this.vectors.size());
		System.out.println("線程集合容量:" + this.vectors.capacity());
		// 創(chuàng)建指定數(shù)量的工作線程并啟動(dòng)
		for(int i=0;i<this.vectors.capacity();i++) {
			WorkThread w = new WorkThread();
			this.vectors.add(w);
			w.start(); // 啟動(dòng)工作線程
		}
	}
	/**
	 * 執(zhí)行任務(wù)方法
	 * 查找空閑線程并分配任務(wù)
	 * @param taskName 任務(wù)名稱
	 */
	public void executeTask(String taskName) {
		// 遍歷線程池中的線程,尋找空閑線程
		for(int i=0;i<this.vectors.capacity();i++) {
			WorkThread w = (WorkThread) this.vectors.get(i);
			System.out.println("線程池中的線程" + w.getName() + "的狀態(tài)為:" + w.isFlag());
			// 如果線程處于空閑狀態(tài)(flag為false)
			if(!w.isFlag()) {
				System.out.println(w.getName() + ",現(xiàn)在是空閑狀態(tài),分配新任務(wù)");
				// 設(shè)置線程為忙碌狀態(tài)
				w.setFlag(true);
				// 分配任務(wù)
				w.setTaskName(taskName);
				// 從任務(wù)隊(duì)列移除已分配的任務(wù)
				PoolInit.linkTaskName.remove(0);
				break; // 找到空閑線程后退出循環(huán)
			}
		}
	}
}

使用 Vector 存儲(chǔ)工作線程,因?yàn)?Vector 是線程安全的集合,構(gòu)造方法中創(chuàng)建并啟動(dòng)指定數(shù)量的工作線程

executeTask()方法將任務(wù)分配給空閑線程:

遍歷所有工作線程,檢查線程狀態(tài)

找到空閑線程后,設(shè)置線程狀態(tài)為忙碌,分配任務(wù)

從任務(wù)隊(duì)列中移除已分配的任務(wù)

1.1.2.3 WorkThread
package com.lj.demo5;
/**
 * 工作線程類
 * 實(shí)際執(zhí)行任務(wù)的線程
 */
public class WorkThread extends Thread {
	// 線程狀態(tài)標(biāo)志:false表示空閑,true表示忙碌
	private boolean flag;
	// 當(dāng)前執(zhí)行的任務(wù)名稱
	private String taskName;
	/**
	 * 線程運(yùn)行方法
	 * 循環(huán)處理任務(wù):有任務(wù)則執(zhí)行,無任務(wù)則等待
	 */
	@Override
	public synchronized void run() {
		while (true) {
			if (this.isFlag()) { // 有任務(wù)要執(zhí)行
				System.out.println(Thread.currentThread().getName() + "正在執(zhí)行任務(wù):" + this.taskName);
				try {
					// 模擬任務(wù)執(zhí)行時(shí)間(30秒)
					Thread.sleep(30 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "已完成任務(wù):" + this.taskName + ",狀態(tài)變?yōu)榭臻e");
				// 任務(wù)完成,設(shè)置為空閑狀態(tài)
				this.setFlag(false);
			} else { // 無任務(wù)
				System.out.println("任務(wù)隊(duì)列中等待的任務(wù)數(shù)量:" + PoolInit.linkTaskName.size());
				// 檢查是否有未處理的任務(wù)
				if (PoolInit.linkTaskName.size() > 0) {
					String taskName = PoolInit.linkTaskName.get(0);
					PoolInit.t.executeTask(taskName);
					System.out.println(Thread.currentThread().getName() + 
							"發(fā)現(xiàn)未處理任務(wù),嘗試處理:" + taskName);
				} else {
					System.out.println(Thread.currentThread().getName() + ":當(dāng)前沒有任務(wù),進(jìn)入等待狀態(tài)...");
					try {
						// 進(jìn)入等待狀態(tài),釋放鎖
						this.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
	// getter和setter方法
	public boolean isFlag() {
		return flag;
	}
	/**
	 * 設(shè)置線程狀態(tài)
	 * 當(dāng)設(shè)置為忙碌狀態(tài)時(shí),喚醒等待的線程
	 */
	public synchronized void setFlag(boolean flag) {
		this.flag = flag;
		if (this.flag) {
			// 有新任務(wù),喚醒線程
			this.notify();
		}
	}
	public String getTaskName() {
		return taskName;
	}
	public void setTaskName(String taskName) {
		this.taskName = taskName;
	}
}

flag變量用于標(biāo)識(shí)線程狀態(tài):false(空閑),true(忙碌)

run()方法是線程的核心,通過循環(huán)處理任務(wù):

  • 當(dāng)有任務(wù)時(shí)(flag=true),執(zhí)行任務(wù)并休眠模擬處理時(shí)間

        任務(wù)完成后,將線程狀態(tài)設(shè)為空閑

  • 當(dāng)無任務(wù)時(shí)(flag=false),檢查任務(wù)隊(duì)列是否有等待任務(wù)

        如果有等待任務(wù),通知線程池分配任務(wù);如果沒有,則進(jìn)入等待狀態(tài)

1.2 總結(jié)流程

  1. 初始化線程池,創(chuàng)建指定數(shù)量的工作線程并啟動(dòng)
  2. 工作線程啟動(dòng)后進(jìn)入等待狀態(tài),等待接收任務(wù)
  3. 用戶輸入任務(wù),添加到任務(wù)隊(duì)列
  4. 線程池查找空閑線程,分配任務(wù)并喚醒線程
  5. 線程執(zhí)行任務(wù),完成后回到空閑狀態(tài)
  6. 重復(fù)步驟 3-5,直到程序結(jié)束

2. Java分布式處理

分布式系統(tǒng)是由多個(gè)獨(dú)立計(jì)算機(jī)組成的系統(tǒng),這些計(jì)算機(jī)通過網(wǎng)絡(luò)協(xié)同工作,對(duì)外表現(xiàn)為一個(gè)整體。

下面我通過 WebService 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的分布式服務(wù)。

2.1 WebService 服務(wù)接口

package com.lj.data;
import javax.jws.WebMethod;
import javax.jws.WebService;
/**
 * WebService服務(wù)接口
 * 定義遠(yuǎn)程可調(diào)用的方法
 * 
 * RPC(遠(yuǎn)程過程調(diào)用)機(jī)制:
 * - RMI:客戶端和服務(wù)器端都必須是Java
 * - WebService:支持跨語言、跨平臺(tái)通信
 * - 其他:hessian, thrift, grpc, dubbo等
 */
@WebService(targetNamespace = "http://lj.com/wsdl")
public interface IAdminService {
	/**
	 * 定義WebService方法
	 * @return 字符串結(jié)果
	 */
	@WebMethod
	public String queryStr();
}

2.2 WebService 服務(wù)實(shí)現(xiàn)

package com.lj.data.impl;
import javax.jws.WebService;
import com.lj.data.IAdminService;
/**
 * WebService服務(wù)實(shí)現(xiàn)類
 * 提供接口中定義的方法的具體實(shí)現(xiàn)
 */
@WebService(
    portName = "admin",//端口名稱
    serviceName = "AdminServiceImpl",//服務(wù)名稱
    targetNamespace = "http://lj.com/wsdl",//必須與接口的命名空間一致
    endpointInterface = "com.lj.data.IAdminService"http://指定實(shí)現(xiàn)的接口
)
public class AdminServiceImpl implements IAdminService {
	/**
	 * 實(shí)現(xiàn)查詢方法
	 * @return 返回示例字符串
	 */
	@Override
	public String queryStr() {
		return "你好,世界";
	}
}

2.3 發(fā)布 WebService 服務(wù)

package com.lj.webserviceclient;
import javax.xml.ws.Endpoint;
import com.lj.data.IAdminService;
import com.lj.data.impl.AdminServiceImpl;
/**
 * WebService服務(wù)發(fā)布類
 * 將服務(wù)發(fā)布到指定地址,供客戶端調(diào)用
 */
public class App {
    public static void main(String[] args) {
    	System.out.println("開始發(fā)布WebService遠(yuǎn)程服務(wù)...");
    	// 創(chuàng)建服務(wù)實(shí)現(xiàn)類實(shí)例
    	IAdminService adminService = new AdminServiceImpl();
    	// 發(fā)布服務(wù),指定服務(wù)地址
    	Endpoint.publish("http://127.0.0.1:8225/AdminServiceImpl/admin", adminService);
    	System.out.println("WebService服務(wù)發(fā)布成功!");
    }
}

3.4 WebService 客戶端調(diào)用

package com.lj.webserviceclient;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.lj.data.IAdminService;
/**
 * WebService客戶端
 * 調(diào)用遠(yuǎn)程發(fā)布的WebService服務(wù)
 */
public class App {
    public static void main(String[] args) {
        try {
        	// 服務(wù)的URL地址
            URL url = new URL("http://127.0.0.1:8225/AdminServiceImpl/admin");
            // 創(chuàng)建QName對(duì)象,指定命名空間和服務(wù)名稱
            QName qname = new QName("http://lj.com/wsdl", "AdminServiceImpl");
            // 創(chuàng)建Service對(duì)象
            Service service = Service.create(url, qname);
            // 獲取服務(wù)接口實(shí)例
            IAdminService adminService = service.getPort(IAdminService.class);
            // 調(diào)用遠(yuǎn)程方法
            String message = adminService.queryStr();
            System.out.println("調(diào)用遠(yuǎn)程WebService服務(wù)的結(jié)果為: " + message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

到此這篇關(guān)于Java 線程池+分布式實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)Java 線程池+分布式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java分析講解序列化與字典功能的序列化

    Java分析講解序列化與字典功能的序列化

    在項(xiàng)目開發(fā)地過程中經(jīng)常會(huì)用到字典存儲(chǔ)某些可配置的值,但相應(yīng)的也會(huì)給開發(fā)帶來復(fù)雜度,比如數(shù)據(jù)庫(kù)存儲(chǔ)的值為字典值:0,1,2,3這種類型的值,但是前端頁面卻需要展示為 啟動(dòng)、禁用、刪除 等中文狀態(tài),下面我們來看兩種解決方案
    2022-06-06
  • 在Java的JDBC使用中設(shè)置事務(wù)回滾的保存點(diǎn)的方法

    在Java的JDBC使用中設(shè)置事務(wù)回滾的保存點(diǎn)的方法

    這篇文章主要介紹了在Java的JDBC使用中設(shè)置事務(wù)回滾的保存點(diǎn)的方法,JDBC是Java用于連接各種數(shù)據(jù)庫(kù)的API,需要的朋友可以參考下
    2015-12-12
  • Java日期與時(shí)間類原理解析

    Java日期與時(shí)間類原理解析

    這篇文章主要介紹了Java日期與時(shí)間類原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Springboot基于enable模塊驅(qū)動(dòng)的實(shí)現(xiàn)

    Springboot基于enable模塊驅(qū)動(dòng)的實(shí)現(xiàn)

    這篇文章主要介紹了Springboot基于enable模塊驅(qū)動(dòng)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java和C#下的參數(shù)驗(yàn)證方法

    Java和C#下的參數(shù)驗(yàn)證方法

    下面小編就為大家?guī)硪黄狫ava和C#下的參數(shù)驗(yàn)證實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁眉頁腳水印

    SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁眉頁腳水印

    這篇文章主要為大家詳細(xì)介紹了SpringBoot使用iText7實(shí)現(xiàn)將HTML轉(zhuǎn)成PDF并添加頁眉頁腳水印的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Maven聚合開發(fā)實(shí)例詳解

    Maven聚合開發(fā)實(shí)例詳解

    這篇文章主要介紹了Maven聚合開發(fā)實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Elasticsearch Search After分頁查詢所有數(shù)據(jù)的實(shí)現(xiàn)方式

    Elasticsearch Search After分頁查詢所有數(shù)據(jù)的實(shí)現(xiàn)方式

    這篇文章主要介紹了Elasticsearch Search After分頁查詢所有數(shù)據(jù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • java 面試題閏年判斷詳解及實(shí)例

    java 面試題閏年判斷詳解及實(shí)例

    這篇文章主要介紹了java面試題 閏年判斷的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • springboot獲取微信JSDK簽名信息的實(shí)現(xiàn)示例

    springboot獲取微信JSDK簽名信息的實(shí)現(xiàn)示例

    本文介紹了如何在Spring Boot應(yīng)用中獲取微信JSDK的簽名信息,包括獲取接口URL、參數(shù)設(shè)置、簽名算法和獲取簽名結(jié)果的步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11

最新評(píng)論

湾仔区| 甘南县| 建水县| 宽城| 阿拉善盟| 周至县| 大关县| 西藏| 武隆县| 郑州市| 高雄市| 通州市| 凯里市| 赤水市| 莲花县| 平邑县| 武城县| 洪湖市| 寿光市| 兰溪市| 嘉定区| 乌兰察布市| 成武县| 宝山区| 怀柔区| 普格县| 稻城县| 乐陵市| 宁河县| 克拉玛依市| 乌拉特后旗| 友谊县| 鄂温| 吴旗县| 尤溪县| 合阳县| 南澳县| 磴口县| 双城市| 葫芦岛市| 吴桥县|