0 0

请问使用两个线程分别输出100以内的奇数和偶数,并按从小到大的顺序输出如何操作?5

]public synchronized void run(){
oushu();

qishu();
}
public void oushu(){  //偶数
for (int i = 0; i < 101; i++) {
if(i%2==0){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
public void qishu(){  //奇数
for (int i = 0; i < 101; i++) {
if(i%2!=0){
引用
System.out.println(Thread.currentThread().getName()+i);
}
}
}

这是我写的,这样写的话永远都不对

问题补充:public class Test {
public static void main(String[] args) {
Shuju sj=new Shuju();
Thread ou=new Thread(sj);
Thread qi=new Thread(sj);
ou.setName("偶数为:");
qi.setName("奇数为:");
ou.start();
qi.start();
}

}
 
2014年5月25日 00:42

4个答案 按时间排序 按投票排序

0 0

采纳的答案

例如 产生的奇数和偶数: 1,2,3,4 这样? 如果是这样应该是不行的 那个线程片段性的执行,就是有段时间是线程ou执行 有段时间是线程qi执行 但是执行的时候貌似是不能控制每个线程执行循环的次数 所以2个线程排序有点困难的

2014年5月25日 03:34
0 0

public class Test15 implements Runnable{
  
int start=1;
public Test15(int start){
this.start=start;
}
@Override
public void run() {
StringBuffer result= new StringBuffer(start+"");
for(int i=0;i<49;i++){
result.append(",");
result.append(start+(i+1)*2);
}
System.out.println(result.toString());
}

public static void main(String[] args){
new Thread(new Test15(1)).start();
new Thread(new Test15(2)).start();
}
}

2014年5月26日 11:00
0 0

呵呵,楼主这两个循环都可以把步长调整为每次+2,这样可以把里面判断为奇数还是偶数的代码省了。
这样,第一段执行完了之后,再让第二个线程开始执行,这个过程可以使用CountDownLatch来控制。
或者使用阻塞队列,所有这些数据放到队列中,每个线程消费一个之后wait,同时notify让另一个线程来执行,这样达到分别输出的目的。

2014年5月25日 10:19
0 0

可以用个线程池里面丢两个线程跑的
如下:
import java.util.concurrent.atomic.AtomicInteger;

public class OddNumber implements Runnable
{
    private int maxNumber;
    private AtomicInteger number;
    private Object lock;
    
    public OddNumber(int maxNumber, AtomicInteger number, Object lock)
    {
        this.maxNumber = maxNumber;
        this.number = number;
        this.lock = lock;
    }
    
    public void run()
    {
        print();
    }
    
    public void print()
    {
        while (number.get() < maxNumber + 1)
        {
            if (number.get() % 2 == 0)
            {
                System.out.println(Thread.currentThread().getName() + " --> " + number.getAndAdd(1));
                
                synchronized (lock)
                {
                    lock.notifyAll();
                }
            }
            else
            {
                synchronized (lock)
                {
                    try
                    {
                        lock.wait(); //wait for the lock
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
}


import java.util.concurrent.atomic.AtomicInteger;

public class EvenNumber implements Runnable
{
    private int maxNumber;
    private AtomicInteger number;
    private Object lock;
    
    public EvenNumber(int maxNumber, AtomicInteger number, Object lock)
    {
        this.maxNumber = maxNumber;
        this.number = number;
        this.lock = lock;
    }
    
    public void run()
    {
        print();
    }
    
    public void print()
    {
        while (number.get() < maxNumber + 1)
        {
            if (number.get() % 2 != 0)
            {
                System.out.println(Thread.currentThread().getName() + " --> " + number.getAndAdd(1));
                
                synchronized (lock)
                {
                    lock.notify(); //
                }
            }
            else
            {
                synchronized (lock)
                {
                    try
                    {
                        lock.wait();  //wait for the lock
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
}

package com.mycompany.app6;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class PrintOddEvenNumbersWithTwoThreads
{
    public static void main(String[] args)
    {
        final int max = 10;
        final AtomicInteger i = new AtomicInteger(1); //start with 0
        Executor dd = Executors.newFixedThreadPool(2);
        
        final Object lock = new Object();
        
        dd.execute(new OddNumber(max, i, lock));
        dd.execute(new EvenNumber(max, i, lock));
        
        do
        {
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        
        while (i.get() != max + 1);
        
        System.out.println("\nDone");
        System.exit(0);
    }
}

2014年5月25日 07:58

相关推荐

    多线程输出奇偶数

    C# 多线程输出奇偶数。两种方法。速度快

    java 两个线程相互顺序输出

    通过以上分析,我们可以了解到解决“java 两个线程相互顺序输出”的关键在于理解并正确应用Java的线程同步和通信机制。实际编程时,我们需要考虑线程安全、资源分配以及可能的并发问题,以确保程序的正确性和效率。

    java用线程两种方式

    在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...

    正偶数分解两个素数之和

    - `#include&lt;iostream.h&gt;`和`#include&lt;math.h&gt;`:这两个头文件分别用于处理输入输出操作以及提供数学函数支持。 - `int fen(int n)`:定义了一个判断素数的函数,返回值为1表示n是素数,返回0表示n不是素数。 - `...

    Java线程使用同步锁交替执行打印奇数偶数的方法

    Java 线程使用同步锁交替执行打印奇数偶数的方法 在 Java 中,多线程编程是非常重要的一部分,特别是在需要并发执行多个任务时。然而,在多线程编程中,如何保证线程执行结果的一致性是非常重要的。本文主要介绍了 ...

    printevenodd:使用两个线程按顺序打印偶数个奇数

    printevenodd 使用两个线程按顺序打印偶数个奇数###########################已经使用了两个线程,它们将分别打印偶数和奇数。 MonitorObject用于同步,其中标志isOdd用于指示要打印的线程以及要等待的线程。

    Java实现多线程轮流打印1-100的数字操作

    对于两个线程交替打印1-100的奇偶数,代码中使用了一个`volatile`关键字修饰的`flag`变量。`volatile`关键字确保了多个线程之间对共享变量的可见性,即一旦一个线程修改了`flag`的值,其他线程可以立即看到这个改变...

    线程顺序输出的问题

    这个小程序写了三个线程是按照我的意愿来输出的,其中要利用lock锁与condition_t2.signal();

    Java实现的两个线程同时运行案例

    在本文中,我们将介绍如何使用Java实现两个线程同时运行的案例,涉及Java多线程相关操作与使用技巧。 Java多线程编程的优点包括: 1. 提高程序的执行效率:多线程编程可以将复杂的任务分解成多个小任务,每个任务...

    线程的编写

    一个小的关于进程的编写,可能不是很完善,还需在升入理解

    7--实验7.doc

    使用`Math.random()`生成0到1之间的随机浮点数,乘以3000再加上1000,得到一个1000到4000毫秒的随机休眠时间,使得两个线程的运行顺序不可预测,更真实地模拟多线程环境。 7. **主类`ThreadDemo`**: `main`方法...

    linux中一个程序的两个线程的同步(c语言实现)

    P 操作(wait 操作)和 V 操作(signal 操作)是信号灯的两个基本操作。P 操作将信号灯的值减 1,如果信号灯的值为 0,则线程将被阻塞直到信号灯的值大于 0。V 操作将信号灯的值加 1,如果信号灯的值大于 0,则唤醒...

    C++11用两个线程轮流打印整数的实现方法

    本文将详细解析如何使用C++11的标准线程语法来实现两个线程轮流打印整数,其中一个线程打印奇数,另一个线程打印偶数,同时涉及到线程同步的关键技术——互斥量和条件变量。 首先,为了确保线程安全,我们需要使用...

    C# 不使用Task实现的多线程顺序执行

    在某些特殊情况下需要用到多线程然而又要使其具备顺序性,这种时候就有了一个特殊的场景那就是多线程顺序执行,在现在VS2015中Task自带了顺序执行的方法,但在此之前的旧项目中如果需要使用多线程顺序执行该怎么办呢...

    线程练习题2

    实现两个线程,一个线程打印1-52,另一个线程打印A-Z,要求输出的结果如下: 1 2 A 3 4 B 5 6 C 7 8 D 9 10 11 12 ... 52 E F G H I J K ... X Y Z 即:当数字小于9时,数字和字母交替打印; 当数字大于等于9时,先把...

    动力节点_Java基础视频教程223_线程-练习交替打印奇数和偶数

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、...每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础更扎实的小伙伴。

    C++11 使用条件变量控制三个线程按顺序输出数字

    第一个线程输出3的倍数余1, 第二个线程输出3的倍数余2, 第三个线程输出3的倍数

    操作系统实验二:进程与线程

    你如何修改程序使得两个进程的输出出现在两个不同的控制台窗口上? 2。在windows 环境下编写一个控制台应用程序,输出系统中正在运行的进程的信息,包括进程号、进程所运行的程序、进程的启动时间、在核心态下消耗...

    C#多线程互斥实例 多线程获取同一变量

    3. **竞态条件**:当两个或多个线程同时访问并修改共享资源时,如果没有适当的同步措施,可能导致数据的不一致性,这就是竞态条件。 4. **互斥**:互斥是一种确保任何时候只有一个线程能访问共享资源的技术。在C#中...

    c.zip_按顺序输出

    标题 "c.zip_按顺序输出" 暗示着这是一个关于编程的问题,特别是与排序和输出整数有关的。描述中提到的任务是接收用户输入的三个整数,然后按照特定的顺序进行输出:首先是从大到小,接着是从小到大,最后是先输出...

Global site tag (gtag.js) - Google Analytics