多线程经典编程题 实践篇

题目一:写两个线程,一个线程打印1~52,另一个线程打印字母A~Z。打印顺序为12A34B56C........5152Z。要求用线程间的通信。package test;
import java.lang.Thread;
class Printer{
    private int index = 1;
    public synchronized void print(int n){
        while(index%3==0){
            try{
                wait();
/*在其他线程调用此对象的notify方法钱,导致当前线程等待*/
            }catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        System.out.print(index);
        index++;
        notifyAll();
    }
    public synchronized void print(char c){
        while(index%3!=0){
            try{
                wait();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        System.out.print(c);
        System.out.print(index);
        index++;
        notifyAll();
    }
}
class NumberPrinter extends Thread{
    private Printer p;
    public NumberPrinter(Printer p){
        this.p=p;
    }
    public void run(){
        for(int i=1;i<=52;i++)
            p.print(i);
    }
}
class CharPrinter extends Thread{
    private Printer p;
    public CharPrinter(Printer p){
        this.p=p;
    }
    public void run(){
        for(char c=‘A‘;c<=‘Z‘;c++)
            p.print(c);
    }
}
public class MyThread {
    public static void main(String args[]){
        Printer p = new Printer();
        Thread t1 = new NumberPrinter(p);
        Thread t2 = new CharPrinter(p);
        t1.start();
        t2.start();
    }
}

时间: 2024-12-12 16:49:28

多线程经典编程题 实践篇的相关文章

Java经典编程题50道之四十六

编程实现两个字符串的连接. public class Example46 {    public static void main(String[] args) {        addString("hello"," world!");    }    public static void addString(String s1,String s2){        String s3=s1+s2;        System.out.println("

Java经典编程题50道之五十

有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件 "stud"中. public class Example50 {    public static void main(String[] args) {        stud();    } public static void stud() {        Scanner ss = new Scanner(System.in); 

Java经典编程题50道之九

一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. public class Example09 {    public static void main(String[] args) {        number();    } public static void number() {        int count = 0;        for (int i = 1; i <= 1000; i++) {     

Java经典编程题50道之五

利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. public class Example05 { public static void main(String[] args) {        score(90);    } public static void score(int n) {        char s = n >= 90 ? 'A' : (n < 60 ? 'C' : 'B');        Sys

Java经典编程题50道之十七

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个:第二天早上又将剩下的桃子吃掉一半,而且又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,就只剩下一个桃子了.求第一天共摘了多少个桃子. public class Example17 {    public static void main(String[] args) {        int sum = peach(1);        System.out.println("第一天共摘

Java经典编程题50道之十八

两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人,以抽签决定比赛名单.有人向队员打听比赛的名单:a说他不和x比,c说他不和x. z比.请编程序找出三队赛手的名单. public class Example18 {    public static void main(String[] args) {        vs();    } public static void vs() {        char[] m = { 'a', 'b', 'c' };      

Java经典编程题50道之十六

输出九九乘法表. public class Example16 {    public static void main(String[] args) {        table(9);    } public static void table(int n) {        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= i; j++) {                System.out.print(j +

Java经典编程题50道之十五

输入三个整数x,y,z,请把这三个数由小到大输出. public class Example15 {    public static void main(String[] args) {        sort(15, 10, 5);    } public static void sort(int x, int y, int z) {        if (x > y) {            int t = x;            x = y;            y = t;  

Java经典编程题50道之十四

输入某年某月某日,判断这一天是这一年的第几天? public class Example14 {    public static void main(String[] args) {        year(2017, 1, 1);    } public static void year(int year, int month, int day) {        int d = 0;        int days = 0;        if (year < 0 || month <