zoukankan      html  css  js  c++  java
  • 多线程

    //因为不是类中所有代码都要被线程执行, 为了区分哪些代码需要被执行
    //java提供了Thread类中的run()方法用来包含那些被线程执行的代码
    public class SimpleThread extends Thread {
        public SimpleThread(String name) {        // 参数为线程名称
            setName(name);
        }
        public void run() {        // 覆盖run()方法
            int i = 0;
            while (i++ < 5) {         // 循环5次
                try {
                    System.out.println(getName() + "执行步骤" + i);
                    Thread.sleep(1000);     // 休眠1秒
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        public static void main(String[] args) {
            SimpleThread thread1 = new SimpleThread("线程1");     // 创建线程1
            SimpleThread thread2 = new SimpleThread("线程2");     // 创建线程2
            thread1.start();                                     // 启动线程1
            thread2.start();                                    // 启动线程2
        }
    }

    /*
     * Runnable接口中只有一个run()方法,它非Thread类子类的类提供的一种激活方式。一个类实现Runnable接口后,并不代表
     * 该类是一个“线程”类,不能直接运行,必须通过Thread实例才能创建并运行线程。
     */
    public class SimpleRunnable implements Runnable {
        public void run() { // 覆盖run()方法
            int i = 15;
            while (i-- >= 1) { // 循环15次
                try {
                    System.out.print("*");
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        public static void main(String[] args) {
            //通过Thread实例运行线程
            Thread thread1 = new Thread(new SimpleRunnable(),"线程1"); // 创建线程1
            thread1.start(); // 启动线程1
        }
    }

    public class SyncThread extends Thread {
        private char cha;
        public SyncThread(char cha) {                         // 构造函数
            this.cha = cha;
        }
        public void run() {
            PrintClass.printch(cha);                         // 调用同步方法
            System.out.println();
        }
        public static void main(String[] args) {
            SyncThread t1 = new SyncThread('A');             // 创建线程A
            SyncThread t2 = new SyncThread('B');             // 创建线程B
            t1.start();                                     // 启动线程A
            t2.start();                                     // 启动线程B
        }
    }
    class PrintClass {
        //同步方法的使用:在方法上加synchronized
        public static synchronized void printch(char cha) { // 同步方法
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);                    // 打印一个字符休息1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.print(cha);
            }
        }
    }

    public class SyncThread extends Thread {
        private String cha;
        public SyncThread(String cha) {                 // 构造函数
            this.cha = cha;
        }
        public void run() {
            PrintClass.printch(cha);                    // 调用同步方法
        }
        public static void main(String[] args) {
            SyncThread t1 = new SyncThread("线程A");     // 创建线程A
            SyncThread t2 = new SyncThread("线程B");     // 创建线程B
            t1.start();                                 // 启动线程A
            t2.start();                                 // 启动线程B
        }
    }
    class PrintClass {
        static Object printer = new Object();             // 实例化Object对象
        public static void printch(String cha) {         // 同步方法
            synchronized (printer) {                     // 同步代码块:同步代码块则在方法内部加
                for (int i = 1; i < 5; i++) {
                    System.out.println(cha + " ");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    //进水
    public class ThreadA extends Thread {
        Water water;
        public ThreadA(Water waterArg) {
            water = waterArg;
        }
        public void run() {
            System.out.println("开始进水.....");
            for (int i = 1; i <= 5; i++) {                // 循环5次
                try {
                    Thread.sleep(1000);                // 休眠1秒,模拟1分钟的时间
                    System.out.println(i + "分钟");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            water.setWater(true);                        // 设置水塘有水状态
            System.out.println("进水完毕,水塘水满。");
            synchronized (water) {
                water.notify();                         // 线程调用notify()方法
            }
        }
    }
    
    /*
    notify()方法表示,
    当前的线程已经放弃对资源的占有, 
    通知等待的线程来获得对资源的占有权,
    但是只有一个线程能够从wait状态中恢复,
    然后继续运行wait()后面的语句;
    只会唤醒等待该锁的其中一个线程。
    notifyAll()方法表示,
    当前的线程已经放弃对资源的占有,
     通知所有的等待线程从wait()方法后的语句开始运行;
      唤醒等待该锁的所有线程。
    */
    public class ThreadB extends Thread {
        Water water;
        public ThreadB(Water waterArg) {
            water = waterArg;
        }
        public void run() {
            System.out.println("启动排水");
            if (water.isEmpty()) {                            // 如果水塘无水
                synchronized (water) {                        // 同步代码块
                    try {
                        System.out.println("水塘无水,排水等待中.....");
                        water.wait();                            // 使线程处于等待状态
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("开始排水.....");
            for (int i = 5; i >= 1; i--) {                        // 循环5侧
                try {
                    Thread.sleep(1000);                         // 休眠1秒,模拟1分钟
                    System.out.println(i + "分钟");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            water.setWater(false);                        // 设置水塘无水状态
            System.out.println("排水完毕。");
        }
    }
    public class Water {
        boolean water = false;                            // 反应水塘状态的变量
        public boolean isEmpty() {                            // 判断水塘是否无水的方法
            return water ? false : true;
        }
        public void setWater(boolean haveWater) {            // 更改水塘状态的方法
            this.water = haveWater;
        }
        public static void main(String[] args) {
            Water water=new Water();                        // 创建水塘对象
            ThreadA threadA = new ThreadA(water);            // 创建进水线程
            ThreadB threadB = new ThreadB(water);            // 创建排水线程
            threadB.start();                                // 启动排水线程
            threadA.start();                                // 启动进水线程
        }
    }

    public class Consumer extends Thread {
      private Share shared;//共享资源区
      private int number;
      public Consumer(Share s, int number) {
        shared=s;
        this.number=number;
      }
     public void run() {
        int value = 0;
        for (int i=0; i<10; i++) {
          value=shared.get();//从共享区消费数字
          System.out.println("消费者"+this.number+"  得到的数据为:"+value);
        }
      }
    }
    public class Producer extends Thread {
      private Share shared;//共享资源区
      private int number;
      public Producer(Share s, int number) {
        shared=s;
        this.number=number;
      }
     public void run() {
        for (int i=0; i<10; i++) {
          shared.put(i);//生产数字放入共享区
          System.out.println("生产者"+this.number+"  输出的数据为:"+i);
          try {
            sleep((int)(Math.random() * 100));//休眠随机时间
          } catch (InterruptedException e) {}
        }
      }
    }
    //(1)
    public
    class Share { private int contents; public int get(){//从共享区取数字 return contents; } public void put(int value){//放入共享区 contents=value; } }
    public class PCTest {
      public static void main(String[] args) {
        Share s=new Share();
        Producer p=new Producer(s,1);
        Consumer c=new Consumer(s,1);
        p.start();
        c.start();
      }
    }

    public class Share {
        private int contents;
        
        private boolean available = false;
        //private  int count=0;
         //生产者
        public synchronized int get() {
        while (available==false) {
          try {
              Thread.sleep(1000);
            wait();
          } catch (InterruptedException e) {}
        available=false;
        notifyAll();
        }
        return contents;
        }
        
        //生产者输出
        public synchronized void put(int value) {
            while (available == true) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
            contents = value;
            available =true;
            notifyAll();
        }
    }
    /*
    *等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:
    wait:告诉当前线程放弃执行权,并放弃监视器(锁)并进入阻塞状态,直到其他线程持有获得执行权,并持有了相同的监视器(锁)并调用notify为止。
    notify:唤醒持有同一个监视器(锁)中调用wait的第一个线程,被唤醒的线程是进入了可运行状态。等待cpu执行权。
    notifyAll:唤醒持有同一监视器中调用wait的所有的线程。

    *
    */

    *
    */

  • 相关阅读:
    mysql的安装、启动和基础配置 —— windows版本
    Navicat安装及简单使用
    期货黄金与现货黄金比较
    android 网络编程--socket tcp/ip udp http之间的关系
    socket、tcp、udp、http 的认识及区别
    Android数据传递的五种方法汇总
    android 应用程序Activity之间数据传递与共享的几种途径
    Android数据存储的五种方法汇总
    Android终端与服务器数据传输解决方案
    转载 解决Android与服务器交互大容量数据问题
  • 原文地址:https://www.cnblogs.com/ywqtro/p/11849891.html
Copyright © 2011-2022 走看看