线程池线程同步问题???

大家好,请教个问题

ExecutorService pool = Executors.newFixedThreadPool(10);
for (int i = 0; i < len; i++) {

pool.execute(new Before());
pool.execute(new MyThread());
pool.execute(new After());
} 如何让pool中的三个线程按顺序执行?谢谢

1个回答

嗨:
用 newSingleThreadExecutor();
细节建议多看下API。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

windows线程池中线程同步问题

使用线程池进行fft的并行处理,虽然产生了多条线程处理,但在蝶形运算每一级处理后需要同步,等待蝶形数组全部处理完才能进行下一级运算,我的问题是如何对线程池中处理这些数据的线程进行同步

关于java 中的线程同步问题,求大神解释。

对于一个已经继承了Runnable 接口的类来说,假设创建了一个它的实例为 account, 那么: for(int i=0;i<500;i++) { new Thread(account).start(); } 不会造成500个线程同步访问同一资源而引发冲突? 为什么: private ExecutorService executor = Executors.newCachedThreadPool(); //在线程池中为每个等待的任务创建一个线程 for(int i=0;i<500;i++) { executor.execute(account); } 这样就会造成线程同步访问同一临界资源冲突呢?

C++ 多线程同步问题?

``` #include <iostream> #include <thread> #include <string> #include <vector> #include <mutex> #include <condition_variable> #include <map> #include <ctime> #include <random> #include <chrono> #include <unistd.h> #define NUM_OF_SAMPLES 50 #define MAX_NUM_OF_THREADS 6 using namespace std; class Sensor { private: string sensorType; public: Sensor(string& type) : sensorType(type){} //Declare a virtual method to be overridden by derived classes: virtual double getValue() = 0; //Declare non-virtual method: string getType() { return sensorType; } }; class TempSensor : public Sensor { public: TempSensor(string& s) : Sensor(s) {} double getValue() { return (double)rand() / ((double)RAND_MAX / 20) + 10; } }; class PressureSensor : public Sensor { public: PressureSensor(string& type) : Sensor(type) {} double getValue() { return (double)rand() / ((double)RAND_MAX / 10) + 95; } }; class CapacitiveSensor : public Sensor { public: CapacitiveSensor(string& type) : Sensor(type) {} double getValue() { return (double)rand() / ((double)RAND_MAX / 4) + 1; } }; class BC { private: bool lock = false; //'false' means that the BC is not locked vector<Sensor *>& theSensors; //reference to vector of Sensor pointers mutex BC_mu; condition_variable cv; map<int, string> sensorMap; map<int, int> countMap; public: BC(vector<Sensor *>& sensors) : theSensors(sensors) { sensorMap.insert(pair<int, string>(0, "temperature")); sensorMap.insert(pair<int, string>(1, "pressure")); sensorMap.insert(pair<int, string>(2, "capacitive")); } void requestBC(int index) { unique_lock<mutex> lk(BC_mu); if (lock) { cout << "BusController is locked, thread " << index << " is about to suspend.." << endl; cv.wait(lk); } lock = true; cout << " BusController locked by thread " << index << endl; return; } double getSensorValue(int selector) { countMap[selector]++; return theSensors[selector]->getValue(); } void releaseBC(int index) { unique_lock<mutex> lk(BC_mu); lock = false; cout << "BusController unlock by thread " << index << endl; cv.notify_one(); } string getSensorType(int selector) { return sensorMap[selector]; } void printCntSensorType() { for (auto it = countMap.begin(); it != countMap.end(); it++) { cout << sensorMap[it->first] << " accessed " << it->second << " times" << endl; } } }; void run(BC& theBC, int index) { random_device rd; mt19937 gen(rd()); uniform_int_distribution<> dis1(0, 2); uniform_int_distribution<> dis2(1000, 10000); for (int i = 0; i < NUM_OF_SAMPLES; i++) { theBC.requestBC(index); int sensorTypeIndex = dis1(gen); string sensorStr = theBC.getSensorType(sensorTypeIndex); double randSensorValue = theBC.getSensorValue(sensorTypeIndex); cout << " sample value from thread " << index << " from " << sensorStr << " sensor = " << randSensorValue << endl; theBC.releaseBC(index); usleep(dis2(gen)); } } int main() { vector<Sensor *> sensors; string temp = "temperature", pressure = "pressure", capa = "capacitive"; sensors.push_back(new TempSensor(temp)); sensors.push_back(new PressureSensor(pressure)); sensors.push_back(new CapacitiveSensor(capa)); BC theBC(ref(sensors)); thread theThreads[MAX_NUM_OF_THREADS]; for (int i = 0; i < MAX_NUM_OF_THREADS; i++) { theThreads[i] = thread(run, ref(theBC), i); } for (int i = 0; i < MAX_NUM_OF_THREADS; i++) { theThreads[i].join(); } theBC.printCntSensorType(); return 0; } ``` 代码如上所示,主要实现的功能是六个线程去抢占BC类,然后选择不同的sensor进行输出,但是BC类中关于线程的同步机制觉得存在问题,求大神指导。

多线程同步数据且等多线程同时完成后再走主线程

用线程池管理,开10条线程去读取和更新几十万数据,但是主线程直接跑下去了,这个不能允许,但是线程池又不能用join来。自己建Thread join,这10条线程又是一条条运行,不合要求。应该如何做,谢谢

android 多线程线程如何同步

定义了三个线程public Thread thread1,thread2,thread3;分别执行操作,请问如何让这三个线程同步,贴出我的代码 public class MainActivity extends AppCompatActivity { public static SQLiteDatabase db; public static Person person; public Thread thread1,thread2,thread3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); db.execSQL("DROP TABLE IF EXISTS person"); db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)"); person = new Person(); person.name = "john"; person.age = 30;; db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[]{person.name, person.age}); person.name = "david"; person.age = 33; ContentValues cv = new ContentValues(); cv.put("name", person.name); cv.put("age", person.age); person.name = "dasdd"; person.age = 33; ContentValues cv1 = new ContentValues(); cv1.put("name", person.name); cv1.put("age", person.age); person.name = "dasdd"; person.age = 88; ContentValues cv2 = new ContentValues(); cv2.put("name", person.name); cv2.put("age", person.age); db.insert("person", null, cv); db.insert("person", null, cv1); db.insert("person", null, cv2); thread1 = new Thread(new Runnable() { @Override public void run() { person.name = "abc"; person.age = 100; ContentValues cv = new ContentValues(); cv.put("name", person.name); cv.put("age", person.age); person.name = "axt"; person.age = 67; ContentValues cv1 = new ContentValues(); cv1.put("name", person.name); cv1.put("age", person.age); int i =1; while (i<10){ db.insert("person", null, cv); db.insert("person", null, cv1); i++; } } }); thread1.start();; thread2 = new Thread(new Runnable() { @Override public void run() { person.name = "张"; person.age = 47; ContentValues cv1 = new ContentValues(); cv1.put("name", person.name); cv1.put("age", person.age); person.name = "QQQ"; person.age = 999; ContentValues cv = new ContentValues(); cv.put("name", person.name); cv.put("age", person.age); db.insert("person", null, cv); db.insert("person", null, cv1); } }); thread2.start(); thread3 =new Thread(new Runnable() { @Override public void run() { Cursor c= db.rawQuery("SELECT * FROM person WHERE age >= ?",new String[]{"30"}); while (c.moveToNext()) { int _id = c.getInt(c.getColumnIndex("_id")); String name = c.getString(c.getColumnIndex("name")); int age = c.getInt(c.getColumnIndex("age")); Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age); //c.close(); } } }); thread3.start(); // // db.delete("person", "age < ?", new String[]{"35"}); // db.close(); // deleteDatabase("test.db"); } public class Person{ String name; Integer age; } public synchronized void same(){ try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 求大神指点synchronized方法要怎么用?

android中多线程同步去执行一万条网络请求耗时指令

android中多线程同步去执行一万条网络请求耗时指令,是否在执行时间上同比于单线程执行这一操作会提高?这里指的是在同步操作的情况下!请大侠指点

使用多个线程池还是一个线程池

最近在技术理论上遇到一个问题,不知道怎么解决。 问题描述:我们交易平台有4个商品(A、B、C、D)需要进行现在交易,交易的核心方法dealorder是 一个加了锁和事务的方法,而且该类是针对每一个商品的,即最多同时可以执行4个dealOrder方法,即每个商品执行一个该方法。 ``` @Transactional public synchronized Message dealOrder() ``` CPU核心数是固定的,假如为6核心,目前就存在一个问题, 情况1:假如说创建一个线程池,过来了大量的A商品请求,超过6个就被放进了队列中,再过来B、C、D商品的请求,也无法再进行处理。 情况2:假如说创建6个线程池,每个商品一个线程池,这时候,理论上ABCD四个商品就会在各自的线程池中进行处理,这样就不会发上1情况的其他商品等待资源释放的问题,但是真实情况下,6个线程池会去抢占一个CPU获得处理还是自动获取6个CPU核心数进行处理. 我现在没有理论上的经验,通过实践似乎可以看出来2情况要理想,但是真实情况下是否如此,真心需要理论上给出结论。

java多线程同步问题

假设一个用户有100元,他有10次消费记录, 都是11元,用(线程池)10个线程同步处理10个消费记录,在用户 余额允许的情况下,处理一个从用户余额中扣除本次消费的费用, 消费成功返回1,消费不成功返回0,最后结算用户的余额,以及返回 多少个1,多少个0。 如果返回的全部都是1,而且用户余额为负数了, 那怎么解决当用户余额不够了那次消费就不能处理了,那么返回0, 同样考虑用多线程同步来处理

Java CompletableFuture线程安全问题

有如下代码,想问下这种情况下会有线程安全问题吗,我回调方法里去赋值this.result1和this.result2,然后在最后去读者两个字段,读和写不是同一线程不用同步吗? ``` public void newInit() throws ExecutionException, InterruptedException { CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> { return 1L; }).thenAccept(result -> { this.result1 = result; }); CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> { return 2L; }).thenAccept(result -> { this.result2 = result; }); CompletableFuture.allOf(cf1, cf2).get(); System.out.println(this.result1) } ```

spring的service中新建一个线程的事务问题

想用线程池的方式来处理业务,在service中调用线程池然后处理业务,线程方法里引用了其他的service,不知道整体的事务spring会不会控制,还是只能控制引用的各个service。线程池是Executors建的,应该没有被spring管理

C++多线程内存泄漏问题

在主线程用AfxBeginThread开启子线程时,偶尔会报内存泄漏的错误(单线程没问题) 不是频繁报,10次有1~2次的样子,debug我也不知道怎么跟踪,怀疑是锁的问题加上 CCriticalSection cs; cs.Lock();cs.Unlock();后发现还是不行,求助! ``` /*结构体*/ typedef struct _dlgTag { int nIdx; CString strName; } DLGTAG; /*主线程代码*/ //初始化数组 m_Table.clear(); m_Table.swap(vector<vector<CString>>()); m_Table.resize(nLineCount); for (int i = 0; i < nLineCount; i++) { m_Table[i].resize(3); } //遍历 nThreadNum = 0; nThreadAll = 30; for (int i = 0; i < nLineCount; i++) { //多线程工作 if (nThreadNum < nThreadAll) { DLGTAG *dd = new DLGTAG(); dd->nIdx = i; dd->strName = strLine; AfxBeginThread(LoopWorkThread, (LPVOID)dd); nThreadNum++; continue; } //轮巡线程池 while (1) { int nNull = 0, nBegin = i - nThreadAll, nEnd = i; switch (nBegin) { case 0: nBegin++; nEnd++; break; default: break; } for (int j = nBegin; j < nEnd; j++) { if (m_Table[j][1].IsEmpty()) { nNull++; Sleep(100); } } //已完成数 if (nThreadAll - nNull > 0) { nThreadNum = nNull; i--; break; } } } //遍历结束检查线程是否全部执行完毕 while (1) { int nNull = 0, nDone = 0; for (int i = 0; i < nLineCount; i++) { if (m_Table[i][1].IsEmpty()) { nNull++; Sleep(100); } } nDone = nLineCount - nNull; if (nDone >= nLineCount) { break; } } /*子线程LoopWorkThread代码*/ CCriticalSection cs; UINT LoopWorkThread(LPVOID pParam) { DLGTAG* dlg = (DLGTAG*)pParam; CString strFlag = TestTest(dlg->nIdx, dlg->strName); if (strFlag == "成功") { cs.Lock(); m_Table[dlg->nIdx][2] = 业务代码... } m_Table[dlg->nIdx][1] = strFlag; cs.Unlock(); delete dlg; return 0; } ```

OpenMP多线程简单编程耗时问题

现在为了更好的优化程序,想测试OpenMP多线程在多核cpu下运行耗时情况,就一个简单的产生随机数问题,循环产生10次,每次产生100000000个随机数放入数组,对产生随机数的程序使用动态dynamic调度实现,为什么在产生前一两次的用时要远大于后面几次的用时(由于需要,在产生的10里并没有使用并行,只是产生随机数的时候用的openmp并行),恳请大家帮忙赐教

关于线程池的小想法

首先 吾辈先声明下 吾辈是菜菜, 所以大湿们觉得的那里说错了 尽量喷~~ <br /> <br />今天早上 吾辈蛋疼的看了下 Excutors 的源代码, 又看了下以前用到线程池的一些方法, 发现了一个小问题 <br />吾辈一直是先弄出个线程池, 然后玩命的在线程池里面死命的塞对象 <br /><pre name="code" class="java"> ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1); pool.submit(new xRunnable()); : : pool.shutdown(); while (true) { if(pool.isTerminated()) break; TimeUnit.SECONDS.sleep(2); } </pre> <br />线程池的主要目的是减少线程创建与销毁的时间吧? &amp;&amp; 资源的创建与销毁 <br />然后吾辈又想了 new xRunnable() 的时候 应该会创建很多资源吧 比如很多Map啊, 一些Bo啊 什么的? <br />(为了线程安全 很多资源 咱都是 new 出来了 吾辈又不怎么热衷于同步的方法, 总是感觉 线程一多, 同步会大大的影响效率) <br /><span style="color: red">问题1: 各位大湿是怎么处理线程安全的啊??</span> <br /> <br />吾辈想了: 那些对象什么的 用完后没有必要被销毁掉, 重新初始化下 应该能继续用吧. <br />然后咱就这样想了: 把那些xRunnable要用到的资源封装成一个对象, (就叫其"资源库"吧) 然后创建一个与线程大小相同的资源库数组, 当要运行xRunnable时候 将其注入到 xRunnable 对象中. <br />而需要拿到那个资源库, 根据线程ID 应该可以判断吧, 反正线程结束 资源库的使命也完成了. <br /> <br /><span style="color: red">问题2: 各位大湿吾辈这样的想法有问题么??</span> <br /> <br />可以能吾辈比较纠结吧 所以没事的时候会钻牛角尖~~ <br /> <br /><span style="color: red">问题3: 咱找了好久, 但是没发现Java的线程池是否可以重写下run的时候的方法</span><br/><strong>问题补充</strong><br/><div class="quote_title">NanguoCoffee 写道</div><div class="quote_div">1: 要啥资源库呀。 要么重新new一个,要么复用已有的 <br />2: 真够钻牛角尖 <br />3: 没事你修改run的方法干嘛? 要修改就自己写个线程池得了</div> <br /> <br />大湿 请问如何复用已有啊 静态 同步 还是??

windows线程池有没有类似cuda内函数__synchreads()用于同步所有线程的函数

windows线程池有没有类似cuda内函数__synchreads()用于同步所有线程的函数

javaweb多线程并发如何处理?如何保证多线程安全?

大家好,感谢大家可以讨论、回答本帖。本人菜鸟一个,也有多年没开发了,也没实际开发过,我所问的是按照我自己的个人想法来提问的,所以很多问题说的不专业,还请谅解。 任务需求: 任务管理系统,是一个系统任务平台。 所遇到的问题是。在这个任务系统中有N个任务,那么也有N个人来抢任务做。 最开始的任务状态是0(没有进行操作)1表示已经进行操作。 任务流程 ---->> 客户端请求任务----->>系统查询是否有状态为0的任务----->查询到状态修改为1----->>x返回给客户端。 那么问题在来了,由于系统的并发量很大。当第一个请求拿到一个为0的任务后还没来得及修改第二个或者第N个请求也拿到了相同的任务,那就造成了重复任务了。 解决方法: synchronized : 效率极低,容易造成系统崩溃。 缓存欲加载,提前加载好预定数量到内存中,查询直接查询缓存数据 缺陷:无法做分布式,或者来说 做分布式比较麻烦。 想请教各位大佬,这种业务应该怎么做。想了很久也没想出好的方案,该系统考虑做分布式。 该系统一秒可能会有几千个请求。

Java 多线程处理亿万级数据

如果有10亿数据要处理,利用分页处理,用线程池处理,如果每个线程处理5000条,开50个线程也不够用啊。 如果无限制开线cpu肯定承受不住,对于这种要怎么处理?

java 如何在for循环中增加三个线程 提高for循环速度

for循环要循环五千次,速度太慢。我想提高速度,想现在在for循环里面写三个线程,进行同步处理,for循环的外部定义了一个list对象,三个线程同步处理的结果都要保存到该list里面,循环结束后要对list进行处理,请问应该如何实现呢?望大神给出具体代码 谢谢!!! ![图片说明](https://img-ask.csdn.net/upload/201709/02/1504342849_742301.png) ![图片说明](https://img-ask.csdn.net/upload/201709/02/1504342857_712060.png) ![图片说明](https://img-ask.csdn.net/upload/201709/02/1504343115_45915.png)

嵌入式多线程开发,多线程共享数据什么时候需要使用volatile?

一般我们在多线程开发过程中,多个线程共享的全局变量或数据的时候都需要加互斥锁或者用信号量同步。 但是有的时候编译器还会优化的,例如写一个变量的时候,可能没有写到内存中,只是写在了本地的寄存器中, 这样多线程的时候一个线程修改了一个变量,另一个线程可能是不知道的,所以我认为多线程共享的全局变量应该使用volatile声明才安全。 但是在实际开发当中,很少看到多线程全局共享变量加volatile。不知道这样可以保证系统安全吗?

多线程内存分配——面试题

如果有10个线程同时申请内存,而使用同步的话,效率比较低,那么如何保证这10个线程都能申请到内存????

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c#跨线程停止timer c#批量写入sql数据库 c# 自动安装浏览器 c#语言基础考试题 c# 偏移量打印是什么 c# 绘制曲线图 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行
立即提问