Java如何实现多线程同步?

问题描述

现在主线程到了某个位置时创建并启动了3个子线程:t1、t2和t3,仅当t1、t2、t3都完成自己任务(比如它们都要计算1到100之和)之后主线程才能执行其下面的工作(比如将t1、t2和t3的运算结果加起来并输出)。请问该如何实现这个功能?听说好像要用到wait()、notify(),但不知道如何用到上面的例子上。

解决方案

t1.join()t2.join()t3.join()
解决方案二:
package org.demo.tmp;/** * 线程同步测试 * @author * @date 2010-12-5 * @file org.demo.tmp.Test.java */public class Test1 {/** * @param args */public static void main(String[] args)throws Exception {/* init 3 task [这里可直接用CountDownLatch]*/CountDown count = new CountDown(3);Task1 t1 = new Task1(count);Task1 t2 = new Task1(count);Task1 t3 = new Task1(count);/* init thread and start */new Thread(t1, "Thread one").start();new Thread(t2, "Thread two").start();new Thread(t3, "Thread three").start();/* wait all threads done */synchronized (count) {count.wait();}/* print the result */int result = t1.getTotal() + t2.getTotal() + t3.getTotal();System.out.println(">> result = " + result);}}/** * 用来计数的类 * @author */class CountDown {/* count */private int count;public CountDown(int value){this.count = value;}public void sub(int number){count -= number;}public int getValue(){return count;}}/** * 线程需要执行的任务 * @author */class Task1 implements Runnable{/* total */private int total = 0;/* count */private CountDown count;/** * constructor * @param count */public Task1(CountDown count){this.count = count;}@Overridepublic void run() {int sum = 0;for (int i=1; i<=100; i++){sum += i;}this.total = sum;System.out.println(Thread.currentThread().getName() + " done.");synchronized (count) {count.sub(1);if (count.getValue() <= 0){count.notify();}}}/** * get total value * @return */public int getTotal(){return total;}}
解决方案三:
引用仅当t1、t2、t3都完成自己任务(比如它们都要计算1到100之和)之后主线程才能执行其下面的工作CountDownLatch就能满足你的需求,用法也非常简单,你看看api里面给的例子。

时间: 2024-10-24 02:33:25

Java如何实现多线程同步?的相关文章

基于Java回顾之多线程同步的使用详解_java

首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索. 为什么要线程同步? 说到线程同步,大部分情况下, 我们是在针对"单对象多线程"的情况进行讨论,一般会将其分成两部分,一部分是关于"共享变量",一部分关于"执行步骤". 共享变量 当我们在线程对象(Run

Java多线程同步问题的探究(一、线程的先来后到)

众所周知,在Java多线程编程中,一个非常重要的方面就是线程的同步问题. 关于线程的同步,一般有以下解决方法: 1. 在需要同步的方法的方法签名中加入synchronized关键字. 2. 使用synchronized块对需要进行同步的代码段进行同步. 3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象. 另外,为了解决多个线程对同一变量进行访问时可能发生的安全性问题,我们不仅可以采用同步机制,更可以通过JDK 1.2中加入的 ThreadLocal

Java开发多线程同步技巧

在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用. 我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一个储蓄账户进行存款.取款操作的. 在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息.在主程序中我们首先生成了1000个线程,然后启动它们,每一个线程都对John的账户进行存100元,然后马上又取出100元.这样,对

java多线程同步问题,小弟百撕不得其解,特来求助!

问题描述 java多线程同步问题,小弟百撕不得其解,特来求助! 多线程共享同一资源,同一张票卖出了多张!同步方法,同步代码块都没用. 问题:编写三各类Ticket.SealWindow.TicketSealCenter分别代表票信息.售票窗口.售票中心.售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程. public class ThreadDemo { public static void main(String[] args) { Thread t1

java多线程同步的问题

问题描述 java多线程同步的问题 小测试,如何实现变量ticket的同步 private int ticket = 100; public void run() { while(ticket > 0 ) { System.out.println(ticket+" is saled by "+ Thread.currentThread().getName()); ticket--; try { Thread.sleep(200); } catch (InterruptedExce

ava 同步-Java 多线程同步工具 CyclicBarrier

问题描述 Java 多线程同步工具 CyclicBarrier Java中使用CyclicBarrier控制多个线程在执行完后,才执行后续操作,请大家帮我分析下,项目两个代码中为什么执行结果不一样: 代码1. public class CyclicBarrierTest2 { public static void main(String[] args) throws InterruptedException, BrokenBarrierException { final CyclicBarrie

java多线程-同步块实例讲解_java

java多线程-同步块 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java 同步块用来避免竞争.本文介绍以下内容: Java 同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java 同步示例 Java 同步关键字(synchronized) Java 中的同步块用 synchronized 标记.同步块在 Java 中是同步在某个对象上.所有同步在一个对象上的同步块在同时只能被一个线程进入并执

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

Servlet及JSP中的多线程同步问题

js|servlet|多线程|问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题.然而,很多人编写Servlet/JSP程序时并没有注意到多线程同步的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题,对于这类随机性的问题调试难度也很大. 一.在Servlet/JSP中的几种变量类型 在