多线程交替打印

public class thread {
    public static void main(String[] args) {
        // 两个线程的锁对象是同一个
        thread tt = new thread();
        JiClass jiClass = tt.new JiClass(tt);
        OuClass ouClass = tt.new OuClass(tt);
        new Thread(jiClass).start();
        new Thread(ouClass).start();

    }
    // 用标志来控制那个线程开始
    private boolean flag;

    public class JiClass implements Runnable {
        private thread t;

        //构造函数
        private JiClass(thread t) {
            this.t = t;
        }

        @Override
        public void run() {
            int i = 1;  //本线程打印奇数,则从1开始
            while (i < 100) {
                //两个线程的锁的对象只能是同一个object
                synchronized (t) {
                    if (!t.flag) {
                        System.out.println("-----" + i);

                        i += 2;
                        t.flag = true;
                        t.notify();

                    } else {
                        try {
                            t.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }
            }
        }
    }
    public class OuClass implements Runnable {
        private thread t;

        private OuClass(thread t) {
            this.t = t;
        }

        @Override
        public void run() {
            int i = 2;//本线程打印偶数,则从2开始
            while (i <= 100)
                //两个线程的锁的对象只能是同一个object
                synchronized (t) {
                    if (t.flag) {
                        System.out.println("-----------" + i);
                        i += 2;
                        t.flag = false;
                        t.notify();

                    } else {
                        try {
                            t.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
        }
    }


}

import java.util.concurrent.atomic.AtomicInteger;                        
/**                                                                      
 * 交替打印奇偶数                                                               
 */                                                                      
public class thread {                                                    
	//让两个线程使用同一把锁。交替执行 。                                                 
    //判断是不是奇数 如果是奇数进入奇数线程执行打印并加一。然后线程释放锁资源。然后让该线程等待                      
    //判断是不是偶数,如果是偶数进入偶数线程执行打印并加一。然后线程释放锁资源。然后让该线程等待                      
                                                                         
    private static AtomicInteger atomicInteger =new AtomicInteger(1);    
                                                                         
	public static void main(String[] args) {                             
		Thread a=new Thread(new AThread());                              
		Thread b=new Thread(new BThread());                              
		a.start();                                                       
		b.start();                                                       
	}                                                                    
                                                                         
	//奇数线程                                                               
    public static class AThread implements Runnable{                     
        public void run() {                                              
           while(true){                                                  
               synchronized (atomicInteger) {                            
                if(atomicInteger.intValue()%2 !=0){                      
                    System.out.println("奇数线程:" + atomicInteger.intValue()
                    try {                                                
                        Thread.sleep(500);                               
                    } catch (InterruptedException e1) {                  
                        // TODO Auto-generated catch block               
                        e1.printStackTrace();                            
                    }                                                    
                    atomicInteger.getAndIncrement(); // 以原子方式将当前值加 1。    
                    // 奇数线程释放锁资源                                         
                    atomicInteger.notify();                              
                    //执行完操作后释放锁并进入等待                                     
                    try {                                                
                        atomicInteger.wait();                            
                    } catch (InterruptedException e) {                   
                        e.printStackTrace();                             
                    }                                                    
                }else{                                                   
                        // 奇数线程等待                                        
                        try {                                            
                            atomicInteger.wait();                        
                        } catch (InterruptedException e) {               
                            // TODO Auto-generated catch block           
                            e.printStackTrace();                         
                        }                                                
                    }                                                    
                }                                                        
           }                                                             
        }                                                                
	}                                                                    
                                                                         
    //偶数线程                                                               
    public static class BThread implements Runnable{                     
        public void run() {                                              
            while(true){                                                 
                synchronized (atomicInteger) {                           
                    if(atomicInteger.intValue()%2 ==0){                  
                         System.out.println("偶数线程:"+ atomicInteger.intVal
                         try {                                           
                            Thread.sleep(500);                           
                         } catch (InterruptedException e1) {             
                             // TODO Auto-generated catch block          
                             e1.printStackTrace();                       
                         }                                               
                         atomicInteger.getAndIncrement(); // 以原子方式将当前值加 1
                        // 偶数线程释放锁资源                                     
                        atomicInteger.notify();                          
                        //执行完操作后释放锁并进入等待                                 
                        try {                                            
                            atomicInteger.wait();                        
                        } catch (InterruptedException e) {               
                            e.printStackTrace();                         
                        }                                                
                    }else{                                               
                        try {                                            
                             // 偶数线程等待                                   
                            atomicInteger.wait();                        
                        } catch (InterruptedException e) {               
                            // TODO Auto-generated catch block           
                            e.printStackTrace();                         
                        }                                                
                     }                                                   
                }                                                        
            }                                                            
        }                                                                
    }                                                                    
}                                                                        

 

### 回答1: Java多线程交替打印可以通过使用两个线程和一个共享变量来实现。假设我们需要交替打印数字1到100,其中一个线程负责打印奇数,另一个线程负责打印偶数。 首先,我们需要创建一个共享变量count,并初始化为1。然后,我们创建两个线程,分别为奇数线程和偶数线程。 奇数线程的任务是判断count的值是否小于等于100,如果是则打印count的值,并将count的值加1。然后,让偶数线程继续执行。 偶数线程的任务也是判断count的值是否小于等于100,如果是则打印count的值,并将count的值加1。然后,让奇数线程继续执行。 整个过程会一直进行下去,直到count的值大于100为止。 下面是具体实现的Java代码: ```java public class AlternatePrinting { private static volatile int count = 1; private static Object lock = new Object(); public static void main(String[] args) { Thread oddThread = new Thread(new PrintOdd()); Thread evenThread = new Thread(new PrintEven()); oddThread.start(); evenThread.start(); } static class PrintOdd implements Runnable { @Override public void run() { while (count <= 100) { synchronized (lock) { if (count % 2 != 0) { System.out.println(Thread.currentThread().getName() + ": " + count); count++; lock.notifyAll(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } static class PrintEven implements Runnable { @Override public void run() { while (count <= 100) { synchronized (lock) { if (count % 2 == 0) { System.out.println(Thread.currentThread().getName() + ": " + count); count++; lock.notifyAll(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } } ``` 上述代码中,使用了一个共享的锁对象lock来保证奇数线程和偶数线程之间的互斥和同步。同时,通过wait()和notifyAll()方法实现了线程的阻塞和唤醒操作。 通过以上代码,可以实现奇数和偶数的交替打印,输出结果类似如下: ``` Thread-0: 1 Thread-1: 2 Thread-0: 3 Thread-1: 4 ... Thread-0: 99 Thread-1: 100 ``` 这样就实现了Java多线程交替打印。 ### 回答2: Java多线程交替打印可以通过使用synchronized关键字和wait()、notify()、notifyAll()方法来实现。 首先,可以创建一个共享的对象作为锁,例如可以使用一个Object对象。 然后,创建两个线程,一个线程负责打印奇数,另一个线程负责打印偶数。在这两个线程的run()方法中,使用synchronized关键字来锁住共享对象。通过使用while循环来判断当前的数字是否满足打印条件,如果不满足则调用wait()方法等待;如果满足则打印数字并使用notify()方法唤醒其他线程。 在主线程中,使用start()方法启动这两个线程,并使用Thread.sleep()方法来控制每次打印的间隔时间。 具体实现如下: ``` public class AlternatePrinting { private static final Object lock = new Object(); private static int number = 1; public static void main(String[] args) { Thread oddThread = new Thread(() -> { while (number <= 10) { synchronized (lock) { if (number % 2 == 1) { System.out.println("奇数线程:" + number++); lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); Thread evenThread = new Thread(() -> { while (number <= 10) { synchronized (lock) { if (number % 2 == 0) { System.out.println("偶数线程:" + number++); lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); oddThread.start(); evenThread.start(); } } ``` 上述代码会创建两个线程,一个线程负责打印奇数,另一个线程负责打印偶数。在主线程中启动这两个线程,程序会交替打印奇数和偶数直到数字达到10为止。 ### 回答3: Java中,实现多线程交替打印可以使用两种方法:一是使用synchronized关键字,二是使用Lock和Condition接口。 方法一:使用synchronized关键字 首先,定义一个变量flag作为线程间的通信标志。然后,创建两个线程,分别使用synchronized锁住共享资源并通过wait()和notify()方法交替进行打印。具体步骤如下: 1. 创建一个实现Runnable接口的类,重写run()方法。 2. 在run()方法中,使用synchronized锁住共享资源。 3. 使用while循环,判断flag的值。若flag为true,则调用wait()方法等待,否则进行打印。 4. 打印完后,将flag的值取反,并使用notify()方法唤醒其他线程。 5. 在main()方法中,创建两个线程对象,分别调用start()方法启动线程。 方法二:使用Lock和Condition接口 这种方式使用Lock接口来锁住共享资源,并使用Condition接口的await()和signal()方法来实现线程间的交替打印。具体步骤如下: 1. 创建一个实现Runnable接口的类,重写run()方法。 2. 在run()方法中,使用Lock接口的lock()方法锁住共享资源。 3. 使用while循环,判断flag的值。若flag为true,则调用Condition接口的await()方法等待,否则进行打印。 4. 打印完后,将flag的值取反,并使用Condition接口的signal()方法唤醒其他线程。 5. 在main()方法中,创建一个ReentrantLock对象和两个Condition对象,分别调用lock()方法和newCondition()方法初始化。 6. 创建两个线程对象,分别调用start()方法启动线程。 这两种方法都可以实现多线程交替打印,具体选择哪种方式取决于具体的需求和场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值