线程交替运行

package threadtest;  

public class Test1 {
    /*
     * 两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。
     */
    private static int state = 1;
    private static int num1 = 1;
    private static int num2 = 2;  

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final Test1 t = new Test1();
        new Thread(new Runnable(){
            @Override
            public void run(){
                while(num1<100){
                    //两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印
                    synchronized(t){
                         // 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒
                        if(state!=1){
                            try{
                                t.wait();
                            }catch(InterruptedException e){
                                e.printStackTrace();
                            }
                        }
                        // 当state=1时, 轮到线程1打印5次数字
                        for(int j=0;j<5;j++){
                            System.out.println(num1);
                            num1 +=2;
                        }
                        // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
                        state = 2;
                        // notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁
                        t.notifyAll();
                    }
                }
            }
        }).start();  

        new Thread(new Runnable(){
            @Override
            public void run(){
                while(num2<100){
                    synchronized(t){
                        if(state!=2){
                            try{
                                t.wait();
                            }catch(InterruptedException e){
                                e.printStackTrace();
                            }
                        }  

                        for(int i=0;i<5;i++){
                            System.out.println(num2);
                            num2 +=2;
                        }  

                        state=1;
                        t.notifyAll();
                    }  

                }
            }
        }).start();
    }
}  
时间: 2024-10-26 06:06:37

线程交替运行的相关文章

yield实现线程交替运行

yield的意思是放手,放弃,一个线程调用yield意味着它要告诉虚拟机自己乐意让其它线程占用自己的位置. class Producer extends Thread { public void run() { for(int i = 0; i < 5; i++) { System.out.println("i am producer: producerd item " + i); Thread.yield(); } } } class Consumer extends Thre

一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized

使用synchronized package com.pb.thread.demo5; /**使用synchronized * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行 * * @author Denny * */ public class Count { private int num = 0; private boolean flag = false; // 标识 //加法 public synchronized void add() { while (flag) { tr

记录一次回客科技有关线程的笔试题,三个线程加法和一个线程减法 ,延申的两个线程交替执行

今天去了回客科技 笔试了一波.很遗憾啊,脑袋有思路 但是还没到手写代码很熟练的程度,基本功不到位. 第一道:线程的题:三个线程 +1 一个线程 -1 运算 . 看到网上还有四个线程的,两个加法计算,两个减法运算.基本的思路都是一样的 ,注意看同步处理. 下面贴出代码实现: public class AddTest { private static int i; private static Object object = new Object(); public static void main

深入解析父子线程(父子线程相互独立,子线程使用自己的栈空间,进程要等到所有线程终止运行之后才终止运行)

说起多线程,我们可以说起一大堆和它相关的有趣话题来,比如什么子孙线程关系,父子线程关系,线程同步异步之类的研究话题来,而我今天所说的,是关于父子线程的一些有趣现象. 首先提出一个问题,“在多线程的应用程序中,当父线程结束之后,子线程会不会退出呢?”,本文将围绕这个问题,深入分析windows中父子线程的生命周期及他们之间的关系. 我们知道,不管你使用的是何种编程语言,但当我们在windows下编程,且使用了平台相关性的库的时候,不管我们使用什么函数来创建线程,最终的结果是,我们的代码中都会调用C

两个线程交替打印信息

看见一个关于两个线程交替打印信息的题目,题目大概是 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. 写了两个版本,一个是用了mutex,不用条件变量:另外一个是用条件变量. 第一个,不用条件变量 1 #include <stdio.h> 2 #include <string.h> 3 #include <pthread.h> 4 5 6 7 const int LOOP_

LR_问题_虚拟用户以进程和线程模式运行的区别

进程方式和线程方式的优缺点: 如果选择按照进程方式运行, 每个用户都将启动一个mmdrv进程,多个mmdrv进程会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上运行的并发用户数的数量,因为负载机的资源(内存及其他系统资源)是有限的. 如果选择按照线程方式运行,在默认情况下,controller为每50个用户仅启动一个mmdrv进程,而每个用户都按线程方式来运行,这些线程用户将共享父进程的内存段,这就节省了大量内存空间,从而可以在一个负载生成器上运行更多的用户.(如果选择线程方式来运

让NSURLConnection在子线程中运行

可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加入NSRunLoop,Cocoa库也为其它一些类提供了可以手动加入NSRunLoop的方法,这些类有NSPort.NSStream.NSURLConnection.NSNetServices,方法都是[scheduleInRunLoop:forMode:]形式.我暂时只介绍下最常用的NSURLCon

线程正在运行或被终止;它无法重新启动。

线程被终止abort了无法再次启动,可以先挂起suspend,再resume() bool bl = false; Thread thrd; public Form1() { InitializeComponent(); thrd = new Thread(tAR); } private void btn_Click(object sender, EventArgs e) { if (bl == false) { if (thrd.ThreadState == ThreadState.Suspe

详解SHOW PROCESSLIST显示哪些线程正在运行列出的状态

SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPER权限,您可以看到所有线程.否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程).如果您不使用FULL关键词,则只显示每个查询的前100个字符. 本语句报告TCP/IP连接的主机名称(采用host_name:client_port格式),以方便地判定哪个客户端正在做什么. 如果您得到“too many connections”错误