java阻塞主线程的实现




1.声明计数器线程个数:

CountDownLatch latch= new CountDownLatch(2);

2.线程启动带参数latch:

Worker
worker1= new Worker("zhang
san" , 5000,
latch);

3.线程启动,主线程阻塞:

worker1.start();

latch.await();

4.线程run()方法中计数器技术开始:

public void run(){

System. out.println("Worker
" +workerName +"
do work begin at "+sdf.format( new Date()));

doWork(); //工作了

latch.countDown();//工人完成工作,计数器减一

}

5.整体代码Test:

package tets;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest {

final static SimpleDateFormat sdfnew SimpleDateFormat("yyyy-MM-dd
HH:mm:ss" );

public static void main(String[] args) throws InterruptedException
{

CountDownLatch latch= new CountDownLatch(2);//两个工人的协作

Worker worker1= new Worker("zhang
san" , 5000,
latch);

Worker worker2= new Worker("li
si" , 8000,
latch);

worker1.start(); //

worker2.start(); //

latch.await(); //等待所有工人完成工作

System. out.println("all
work done at " +sdf.format(new Date())+"
"+Thread.currentThread().getName());

}

static class Worker extends Thread{

String workerName;

int workTime ;

CountDownLatch latch;

public Worker(String workerName ,int workTime ,CountDownLatch
latch){

this.workerName =workerName;

this.workTime =workTime;

this.latch =latch;

}

public void run(){

System. out.println("Worker
" +workerName +"
do work begin at "+sdf.format( new Date()));

doWork(); //工作了

System. out.println("Worker
" +workerName +"
do work complete at "+sdf.format( new Date()));

latch.countDown();//工人完成工作,计数器减一

}

private void doWork(){

try {

Thread. sleep(workTime);

catch (InterruptedException e)
{

e.printStackTrace();

}

}

}

}

java阻塞主线程的实现

时间: 2024-10-29 03:25:14

java阻塞主线程的实现的相关文章

Java实现主线程等待子线程

本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器.初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,他的await()方法会阻塞当前进程,直到倒数至0. join方式代码如下: [java] view plain copy package com.test.thread

关于pthread_join函数在使用时如何不阻塞主线程的一种探索

pthread_join 函数是会阻塞主线程的,这会让很多java程序员不适应.因为在java中 start以后一个线程就执行执行了.主线程不会被阻塞. 而在linux中 join是会阻塞的. 那么如何使用join的时候 不阻塞主线程呢.我给出了一个解决方法. #include <stdio.h> #include <pthread.h> void *print_count(int c); void thread_start(); int main(int argc, char c

JAVA进阶----主线程等待子线程各种方案比较(转)

创建线程以及管理线程池基本理解 参考原文链接:http://www.oschina.net/question/12_11255?sort=time 一.创建一个简单的java线程 在 Java 语言中,一个最简单的线程如下代码所示: Java代码   Runnable runnable = new Runnable(){ public void run(){ System.out.println("Run"); } } 可通过下面一行代码来启动这个线程: new Thread(runn

网络开始---多线程---阻塞主线程(演示)(一)

1 #import "ILViewController.h" 2 3 @interface ILViewController () 4 5 @end 6 7 @implementation ILViewController 8 9 - (void)viewDidLoad 10 { 11 [super viewDidLoad]; 12 13 //当前线程 ,判断这个方法在哪个线程中,可以打印这个线程,当num==1时,是在主线程中 14 //其他的在子线程中 ,不能把耗时的操作放在主线程

Qt 定时器signal/slot阻塞主线程界面

示例代码: <span style="font-size:18px;">class bicycle : public QMainWindow { public slots: void uploadDeviceStatus(); }; bicycle::bicycle(QWidget *parent) : QMainWindow(parent) { QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout(

Java并发编程原理与实战六:主线程等待子线程解决方案

本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { System.out.println(this.getName() + "子线程开始"); try { // 子线程休眠五秒 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.

Java多线程--让主线程等待所有子线程执行完毕 join

首先从公司一道笔试题开始 1 package test; 2 3 public class Test implements Runnable { 4 5 public int i = 0; 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(1000); 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printSt

Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束

Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值.CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行.假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调

Java主线程等待所有子线程执行完毕再执行解决办法集

Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线程执行完毕,再响应用户:否则,响应用户的是一个无意义的值. 那么如何确保所有的子线程执行完毕了.一般的有如下方法: 1  让主线程等待,或着睡眠几分钟.用Thread.sleep()或者TimeUnit.SECONDS.sleep(5); 如下: package andy.thread.tradit