玩玩Java多线程共享资源
来源:互联网 发布:成都IT 知乎 编辑:程序博客网 时间:2024/05/21 10:47
玩玩Java多线程共享资源
1.实现效果与思路
需要达到的效果
- 一个集合里面有大量的数据,要求用多线程去操作该数据,线程处理完成后将结果返回给主线程
实现思路
在java中开启子线程有两种方式
1.方式一:implements Runnable
2.方式二:extends Thread
由于我们需要资源共享,所以选择了implements Runnable,并且使用线程池进行线程的控制
2.工作线程的实现逻辑
package com.timmy008; import java.util.Map; import java.util.Map.Entry; /** * 工作线程 * * @author Administrator * */ public class WorkerThread implements Runnable { /** * 任务的集合 */ private volatile Map<String, Work> maps; /** * 当前线程执行任务的结果 */ private volatile int result = 0; private ResultCallback mCallback; private boolean flag; public WorkerThread(Map<String, Work> maps) { super(); this.maps = maps; } /** * 进行的工作 */ private void doWork() { for (Entry<String, Work> entry : maps.entrySet()) { synchronized (maps) { Work value = entry.getValue(); if (value != null) { if (!value.isRunning()) { // TODO 这是执行任务 System.out.println("当前" + Thread.currentThread().getName() + "正在执行任务" + entry.getKey()); value.setRunning(true); result += value.getWorking(); } } } } if (mCallback != null && !flag) { flag =true; mCallback.onResult(result); } } public void setResultCallback(ResultCallback callback) { this.mCallback = callback; } @Override public void run() { doWork(); } }
3.结果的回调
package com.timmy008; /** * 结果的回调 * @author Administrator * */ public interface ResultCallback { /** * 返回结果 * * @param result */ void onResult(int result); }
4.具体的工作实体
package com.timmy008; /** * 工作的实体 * @author Administrator * */ public class Work { /** * 是否运行 */ private boolean isRunning; /** * 具体工作 */ private int working; public Work(boolean isRunning, int working) { super(); this.isRunning = isRunning; this.working = working; } public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } public int getWorking() { return working; } public void setWorking(int working) { this.working = working; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Work [isRunning="); builder.append(isRunning); builder.append(", working="); builder.append(working); builder.append("]"); return builder.toString(); } }
5.测试类
package com.timmy008; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { private static Map<String, Work> maps; public static void main(String[] args) { maps = new HashMap<>(); Work work; for (int i = 0; i < 5000000; i++) { work = new Work(false, i); maps.put("当前是任务" + i, work); } ExecutorService service = Executors.newCachedThreadPool(); WorkerThread workerThread1 = new WorkerThread(maps); workerThread1.setResultCallback(new ResultCallback() { @Override public void onResult(int result) { System.out.println("计算出的结果:" + result); } }); for (int i = 0; i < 10; i++) { service.execute(new Thread(workerThread1)); } service.shutdown();// 执行完线程池中的线程后尽快退出 } }
运行结果
1 0
- 玩玩Java多线程共享资源
- Java多线程之共享资源
- java多线程之共享资源
- Java多线程共享资源
- Java多线程共享资源
- java 多线程 访问一个共享资源
- java多线程之共享资源(2)
- 多线程共享资源
- 多线程共享资源
- JAVA学习笔记 -- 多线程之共享资源
- java多线程(二)解决共享资源竞争
- Java多线程 之 访问共享资源(六)
- Java学习笔记 --- 多线程共享资源Demo
- java多线程-Lock接口(将多线程共享资源锁定)
- Java多线程 之 访问共享资源synchronized、lock(七)
- Java通过继承Thread类实现多线程 ,处理同一个共享资源
- Java多线程系列(3)--解决共享资源竞争synchronized
- 多线程共享资源参考
- 轮盘赌选择,原理及C++实现
- 苹果内购代码
- JAVA读取Oracle中的blob图片字段并显示
- 根据ip获取城市的方法
- 离散傅里叶变换DFT基本原理图解
- 玩玩Java多线程共享资源
- ZendFramework-1.12.17
- Array.prototype.slice.call(arguments)
- MySQL存储过程概述
- unittest参数化
- vb2
- 求素数:普通版素数筛法/快速版素数筛法
- android-长按Home键,删除历史记录时,service的生命周期
- 青春