写2个线程,其中一个线程打印1~52,另一个线程打印A~z,打印顺序应该是12A34B45C……5152Z

我写的

class LN
{
    private int flag = 0;
    public static char ch = ‘A‘;
    public static int n = 1;
    public synchronized void printLetter()
    {
        try
        {
            if(flag == 0 || flag == 1)
            {
                wait();
            }
            else
            {
                //System.out.println("flag = " +     flag);
                System.out.print(ch);
                ch++;

                flag = (flag + 1) % 3;

                notifyAll();
            }
        }
        catch(InterruptedException ex)
        {
            ex.printStackTrace();
        }
    }
    public synchronized void printNumber()
    {
        try
        {
            if(flag == 2 )
            {
                wait();
            }
            else
            {
                //System.out.println("flag = " +     flag);
                System.out.print(n);
                n++;        

                flag = (flag + 1) % 3;

                notifyAll();
            }
        }
        catch(InterruptedException ex)
        {
            ex.printStackTrace();
        }
    }
}

class Letter extends Thread
{
    LN ln;
    Letter(LN ln)
    {
        this.ln = ln;
    }
    public void run()
    {
        for(int i = 0 ; i< 26; i++)
        {
            ln.printLetter();
        }
    }
}
class Number extends Thread
{
    LN ln;
    Number(LN ln)
    {
        this.ln = ln;
    }
    public void run()
    {
        for(int i = 0 ; i< 78; i++)
        {
            ln.printNumber();
        }
    }
}

class Practice1
{
    public static void main(String[] args) {

        LN ln = new LN();
        new Letter(ln).start();
        new Number(ln).start();
    }
}

网上找的

public class ThreadDemo {
// 测试
public static void main(String[] args) {
Object obj = new Object();
// 启动两个线程
Thread1 t1 = new Thread1(obj);
Thread2 t2 = new Thread2(obj);

t1.start();
t2.start();
}
}

class Thread1 extends Thread {
private Object obj;

public Thread1(Object obj) {
this.obj = obj;
}

public void run() {
// 加锁
synchronized (obj) {
// 打印1-52
for (int i = 1; i < 53; i++) {
System.out.print(i);
if (i % 2 == 0) {
// 不能忘了唤醒其它线程
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}
}
}

class Thread2 extends Thread {
private Object obj;

public Thread2(Object obj) {
this.obj = obj;
}

public void run() {
synchronized (obj) {
// 打印A-Z
for (int i = 0; i < 26; i++) {
System.out.print((char) (‘A‘ + i));
// 不能忘了唤醒其它线程
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
时间: 2024-10-17 00:09:22

写2个线程,其中一个线程打印1~52,另一个线程打印A~z,打印顺序应该是12A34B45C……5152Z的相关文章

写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z

题目: 写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z.要求用线程间的通信. /** * 写两个线程,第一个线程打印1-52,第二个线程打印A-Z,打印结果为12A34B...5152Z */public class ThreadPrinter { // true打印数字,false打印字母 private boolean flag = true; // 打印字母 public synchronized void printNumber

Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握hand

JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?

起因 public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(10); service.submit(() -> System.out.println("Hello ")); System.out.println("World"); } 呵呵,执行结果谁都知道,显而易见结论线程池的创建的时候,第一次submit操作会创建Wor

一个简单例子了解使用互斥量线程同步

在刚开始学习学习线程同步时总是认为两个线程或是多个线程共同运行,但是那样是做的. 同步就是协同步调,按预定的先后次序进行运行.如:你说完,我再说. "同"字从字面上容易理解为一起动作. 其实不是,"同"字应是指协同.协助.互相配合. 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行:B依言执行,再将结果给A:A再继续操作. 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它

让我们一起来实现一个完整的内存管理工具(线程,内存池,萃取)

//让我们开始一个完整的内存管理工具的实现吧. ///准备做一个完整的内存管理工具 //涉及线程,内存池,萃取,不仅仅是new跟delete的重载(或者说是函数重载),这是我的一个雏形,大家谁有什么好的指正谢谢提出,一起学习. #include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <list> #include <mal

Wpf 调用线程无法访问此对象,因为另一个线程拥有该对象,解决方案

1.Wpf 多线程修改UI示例: //启动线程修改UI,抛出异常 ThreadPool.QueueUserWorkItem((q) => { button.Content = "张三"; }, null); 解决方案:使用Dispatcher.BeginInvoke+委托方式,修改UI 将修改UI的代码封装在委托中 //启动线程处理 Thread thread1 = new Thread(UpdateBtn); thread1.IsBackground = true;//设置为后

Google面试题—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD

分类: windows编程 C++ 2012-10-27 19:56 3410人阅读 评论(1) 收藏 举报 有四个线程1.2.3.4.线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD.初始都为空.现要让四 个文件呈如下格式:A:1 2 3 4 1 2....B:2 3 4 1 2 3....C:3 4 1 2 3 4....D:4 1 2 3 4 1....请设计程序. [cpp] view plaincopy #include <stdio.h

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

事件循环和线程没有必然关系(就像Windows子线程默认没有消息循环一样),模态对话框和事件循环也没有必然关系(QWidget直接就可以)

周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博客,就代码论事,因此了解到一些 Qt 深层的实现,虽然是在 Qt 庞大的构架里只算的是冰山的一角,确让人颇为收益. 从 dbzhang800 的博客中转载两篇关于事件循环的文章,放在一起,写作备忘. 再次提到的一点是:事件循环和线程没有必然关系. QThread 的 run() 方法始终是在一个单独