• java 多线程


    1.题目要求:自定义一个线程,创建三个实例,功能是打印1~100的数字。
    其中,数字1+3*n(n>=0)必须是第一个线程实例打印的,2+3*n必须是第二个实例打印,3+3*n必须是第三个线程打印,打印结果严格递增,实例1,2,3依次轮流打印。

    2.代码:

    public class Printer implements Runnable {
        int i = 1;
     
        public void run() {
            try {
                synchronized (this) {
                    while (i <= 100) {
                        String threadNo = Thread.currentThread().getName();
                        while (i % 3 != Integer.valueOf(threadNo) % 3) {
                            this.wait();
                        }
                        if (i <= 100)
                            System.out.println(threadNo + ": " + i++);
                        this.notifyAll();
                    }
                }
            } catch (InterruptedException e) {
                System.out.println("InterruptedException occur");
            }
        }
    }
    
    
    
    public class Start {
         
        public static void main(String[] args) {
            Printer printer = new Printer();
            Thread t1 = new Thread(printer,"1");
            Thread t2 = new Thread(printer,"2");
            Thread t3 = new Thread(printer,"3");
            t1.start();
            t2.start();
            t3.start();
        }
    }

    代码2:

    来个简单粗暴无同步的代码

    package cn.byr.nuanyangyang.jishuqi;
     
    class PrintingContext {
        public volatile int current = 1;
    }
     
    class Printer implements Runnable {
        private PrintingContext ctx;
        private String name;
        private int modulo;
     
        public Printer(PrintingContext ctx, String name, int modulo) {
            this.ctx = ctx;
            this.name = name;
            this.modulo = modulo;
        }
     
        @Override
        public void run() {
            while (true) {
                int cur = ctx.current;
                if (cur > 100) {
                    break;
                }
     
                if (cur % 3 == modulo) {
                    System.out.format("[%s] %d
    ", name, cur);
                    int newNum = cur + 1;
                    ctx.current = newNum;
                }
            }
        }
    }
     
    public class MangDengDaiJiShuQi {
        public static void main(String[] args) throws Exception {
            PrintingContext ctx = new PrintingContext();
     
            Printer p1 = new Printer(ctx, "Printer 1", 1);
            Printer p2 = new Printer(ctx, "Printer 2", 2);
            Printer p3 = new Printer(ctx, "Printer 3", 0);
     
            Thread t1 = new Thread(p1);
            Thread t2 = new Thread(p2);
            Thread t3 = new Thread(p3);
     
            long timeStamp1 = System.currentTimeMillis();
            t1.start();
            t2.start();
            t3.start();
     
            t1.join();
            t2.join();
            t3.join();
            long timeStamp2 = System.currentTimeMillis();
     
            System.out.format("Total time: %dms", timeStamp2 - timeStamp1);
        }
    }
    

      

     
     
  • 相关阅读:
    华为上机练习题--求两个数组的总和
    C++设计模式之状态模式(四)
    深入理解java嵌套类和内部类
    c++实现精确计时
    Linux-中断和中断处理
    使用C#对MongoDB中的数据进行查询,改动等操作
    淘特房产CMS系统 7.5
    sass03 变量、样式导入
    sass02
    sass01
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/5488459.html
Copyright © 2020-2023  润新知