多线程问题,,如何让所有子线程结束后再执行主线程,,要C#
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程问题,,如何让所有子线程结束后再执行主线程,,要C#相关的知识,希望对你有一定的参考价值。
objclass t1 = new objclass(pRow, pRow2, pCursor, pCursor2, i, fieldIndex, 0, prowcount / 4);
Thread thread1 = new Thread(t1.xunhuan);
objclass t2 = new objclass(pRow, pRow2, pCursor, pCursor2, i, fieldIndex, prowcount / 4, prowcount / 2);
Thread thread2 = new Thread(t2.xunhuan);
objclass t3 = new objclass(pRow, pRow2, pCursor, pCursor2, i, fieldIndex, prowcount / 2, prowcount * 3 / 4);
Thread thread3 = new Thread(t3.xunhuan);
objclass t4 = new objclass(pRow, pRow2, pCursor, pCursor2, i, fieldIndex, prowcount * 3 / 4, prowcount);
Thread thread4 = new Thread(t4.xunhuan);
thread1.Start();
thread1.Join();
thread2.Start();
thread2.Join();
thread3.Start();
thread3.Join();
thread4.Start();
thread4.Join();
上面是我自己写的,,在此基础上怎么改。。今天刚刚学的多线程。。很多都不懂。能给出代码最好。。谢谢
你的代码基本没有多大问题,只是 Join 方法位置放置不对。
thread1.Start(); // 先启动所有子线程
thread2.Start();
thread3.Start();
thread4.Start();
thread5.Start();
thread1.Join(); // 然后在等待子线程退出
thread2.Join();
thread3.Join();
thread4.Join();
thread5.Join();
你先前的代码:
thread1.Start(); // 线程1 启动
thread1.Join(); // 等待 线程1 退出,线程1 未退出前,后面代码无法执行
thread2.Start(); // 以下代码,均同上所述。
thread2.Join();
thread3.Start();
thread3.Join();
thread4.Start();
thread4.Join();追问
按照你那个方法我已经试过了,,你说的也有道理。。现在我有一个新的问题:我上面的程序是对同一个表进行处理,就是把一个表分成几个相等大小部分,分别对其进行字段的添加。。。
有人说不能同时对一个文件用多线程修改。。是这样吗?有没有什么解决方法。。上面方法我得出来的结果,有部分是错误的。。
“不能同时对一个文件用多线程修改”这句话本身是不正确,通常多线程同时修改一个文件会带来混乱情形而造成运行时逻辑错误,所以应当避免多跟线程同时修改数据。
要避免多线程同时修改数据,这涉及到“线程安全”或者说“线程同步”的知识点,不是一句话能说清楚,建议学习编写“多读一写”的经典多线程程序,即:
1)同时允许多根线程读取数据,在读取没有完成之前,阻止写入线程写入。
2)只允许一根线程写入数据,写入未完成前,禁止其他线程读取数据
MSDN 上有此示例源代码,自己在 MSDN 搜一下。
涉及知识点:互斥体、临界点、事件信号
设置主线程等待子线程执行的方法
首先要注意的是:
1、java的Main线程结束之后,子线程还在运行。其实主线程已经退出了,但是JVM守护线程会等待所有的线程结束,才会退出。所以我们可以看到,子线程依然在继续执行。
2、那么如何实现主线程等待子线程的执行之后再结束,这个就要用到CountDownLatch,设置要执行的线程的个数,然后再子线程的run方法中调用countDown()的方法,递减线程的计数。在主线程结束之前,调用await()的方法,一直等待。
实现如下:
public class Main extends Thread{
private CountDownLatch latch;
public Main(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("son_"+Thread.currentThread().getName()+":"+i);
}
latch.countDown();
};
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(15);
for (int i = 0; i < 15; i++) {
new Main(latch).start();
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main thread end...");
}
}
以上是关于多线程问题,,如何让所有子线程结束后再执行主线程,,要C#的主要内容,如果未能解决你的问题,请参考以下文章
c++/mfc 子线程结束后再来执行主线程下操作 该怎么处理