zoukankan      html  css  js  c++  java
  • 线程的基本操作2

    等待(wait) 和通知(notify)

    这两个方法来自Object类, 使用前必须先获得目标的锁.

    wait()使用场景必须包含在synchronzied语句中., 当调用后,线程释放锁, 进入object对象的等待队列, 等待notify() .notifyAll()去唤醒.

    package threads;
    
    public class WaitAndNotify {
    	final static Object ob = new Object();
    
    	public static class T1 extends Thread {
    		@Override
    		public void run() {
    			synchronized (ob) {
    				System.out.println(System.currentTimeMillis() + " : " + "T1.start");
    				try {
    					System.out.println(System.currentTimeMillis() + " : " + "T1.wait");
    					ob.wait();//放开锁,停止继续执行下一步
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				System.out.println(System.currentTimeMillis() + " : " + "T1.end");
    			}
    		}
    	}
    
    	public static class T2 extends Thread {
    		@Override
    		public void run() {
    			synchronized (ob) {
    				System.out.println(System.currentTimeMillis() + " : " + "T2.start");
    				ob.notify();// 提示其他进程去获取锁
    				System.out.println(System.currentTimeMillis() + " : " + "T2.end");
    				try {
    					Thread.sleep(2000);//占用锁没有放开.导致t2end比t1end早两秒
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	public static void main(String[] args) {
    		Thread t1 = new T1();
    		Thread t2 = new T2();
    		t1.start();
    		t2.start();
    	}
    }
    1568212250034 : T1.start
    1568212250034 : T1.wait
    1568212250034 : T2.start
    1568212250034 : T2.end  两秒
    1568212252034 : T1.end
    

     等待线程结束join() 和 谦让yield()

    有些时候我们需要一个线程依赖其他线程执行完毕才能,才能操作这是使用join()

    join 分为2种 , 第一种是无限等待阻塞进程,直到目标线程执行完毕,

                          第二种是有时间限制, 过了时间就不等了,继续执行下一步.

    private volatile static int  i = 0;
    	
    	public static class Nums extends Thread{
    		@Override
    		public void run() {
    			for ( i = 0; i < 10000999; i++);
    		}
    	}
    	
    	public static void main(String[] args) throws InterruptedException {
    		Nums nums = new Nums(); // 选择目标线程对象, 而不是Thread
    		nums.start(); //0
    		nums.join(); //10000999
    		System.out.println(i);
    	}
    

    yiled()是静态方法,使用后 当前线程让出CPU,继续参与CPU的争夺适用于优先级低,害怕占用太多资源的线程.

    public class YieldA {
    	
    	public static class RunCPU extends Thread{
    		public  RunCPU(String name) {
    			super.setName(name);
    		}
    		@Override
    		public void run() {
    			for (int i = 0; i < 50; i++) {
    				System.out.println(Thread.currentThread().getName() + ":  " + i);
    				if(i == 30) {
    					Thread.yield();
    					try {
    						Thread.sleep(5);
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    			}
    		}
    	}
    	
    	public static void main(String[] args) {
    		RunCPU runCPU = new RunCPU("run111111");
    		RunCPU runCPU2 = new RunCPU("run222222");
    		runCPU.start(); // 到30让出cpu给runCPU2
    		runCPU2.start();// 到30让出cpu给runCPU
    	}
    
    }
    

      

  • 相关阅读:
    计算机的时空观以及俩者间的相互转换
    发送一个记录数据包
    流的压缩与解压缩函数
    通过自定义消息调用主窗体的菜单项
    多标签窗体的释放一法
    记录数组存出到文件和从文件导入
    变体记录
    内存流的使用
    用流读写结构化文件
    下拉框、下拉控件之Select2
  • 原文地址:https://www.cnblogs.com/zkfly/p/11509381.html
Copyright © 2011-2022 走看看