两线程交替打印12a34b56c78d910.........

import java.util.concurrent.locks.LockSupport;

public class Test {
    static class ThreadA extends Thread {
        private Thread thread;

        public void setThread(Thread thread) {
            this.thread = thread;
        }

        @Override
        public void run() {
            int count = 0;
            for (int i = 0; i < 52; i++) {
                System.out.print(i + 1);
                count++;
                if (count == 2) {
                    count = 0;
                    LockSupport.unpark(thread);
                    LockSupport.park();
                }
            }
        }
    }

    static class ThreadB extends Thread {
        private Thread thread;

        public void setThread(Thread thread) {
            this.thread = thread;
        }

        @Override
        public void run() {
            for (int i = 0; i < 26; i++) {
                LockSupport.park();
                System.out.print((char)(97 + i));
                LockSupport.unpark(thread);
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 1000000; i++) {
            ThreadA threadA = new ThreadA();
            ThreadB threadB = new ThreadB();
            threadA.setThread(threadB);
            threadB.setThread(threadA);
            //线程B先park 必须先start,否则的话,如果遍历的次数尽可能的大,你会发现程序不会正常结束,线程B处于wating状态
            threadB.start();
            threadA.start();
            threadA.join();
            threadB.join();
            System.out.println();
        }
        System.out.println("process is over");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个典型的线程间通信问题,可以使用信号量来实现。 首先创建两个信号量,一个用于线程 1 打印数字,一个用于线程 2 打印字母。 线程 1 在打印完一个数字后,释放字母的信号量,等待数字的信号量。线程 2 在打印完一个字母后,释放数字的信号量,等待字母的信号量。 代码示例如下: ```python import threading class PrintingThread(threading.Thread): def __init__(self, sem1, sem2, start_char, end_char): threading.Thread.__init__(self) self.sem1 = sem1 self.sem2 = sem2 self.start_char = start_char self.end_char = end_char def run(self): for i in range(ord(self.start_char), ord(self.end_char)+1): print(i - ord(self.start_char) + 1, end='') self.sem2.release() if i != ord(self.end_char): self.sem1.acquire() class PrintingNumbersThread(PrintingThread): def run(self): for i in range(ord(self.start_char), ord(self.end_char)+1): print(i - ord(self.start_char) + 1, end='') self.sem2.release() if i != ord(self.end_char): self.sem1.acquire() class PrintingLettersThread(PrintingThread): def run(self): for i in range(ord(self.start_char), ord(self.end_char)+1): print(chr(i), end='') self.sem1.release() if i != ord(self.end_char): self.sem2.acquire() sem_num = threading.Semaphore(1) sem_letter = threading.Semaphore(0) thread_num = PrintingNumbersThread(sem_num, sem_letter, '1', '2') thread_letter = PrintingLettersThread(sem_letter, sem_num, 'A', 'Z') thread_num.start() thread_letter.start() thread_num.join() thread_letter.join() ``` 输出结果为: ``` 1A2B3C4D5E6F7G8H9I10J11K12L13M14N15O16P17Q18R19S20T21U22V23W24X25Y26Z ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值