• java 添加一个线程、创建响应的用户界面 。 演示示例代码


    javajava 添加一个线程、创建响应的用户界面 。

    演示示例代码

     来自thinking in java 4 21章  部分的代码  夹21.2.11

    thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155

    package org.rui.thread.concurrent;
    
    /**
     * 增加一个线程
     * 一个线程能够在其它线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续运行。

    * 假设某个线程在还有一个线程T上调用t.join() 此线程将被挂起,直到目标线程t结束才恢复(即 t.isAlive()返回为假) * @author lenovo * */ class Sleeper extends Thread { private int duration; public Sleeper(String name,int sleepTime) { super(name); duration=sleepTime; start(); } /** * Sleeper 它要休眠一段时间 */ @Override public void run() { try { sleep(duration); } catch (Exception e) { //依据 isInterrupted的返回值报告这个中断,当还有一个线程在该线程上调用interrupt()时, //将给该线程设定一个标志,表明该线程已经中断,然而。异常被捕获时将清理这个标志。所以在catch子句中, //在异常被捕获的时候这个标志总是为假。除异常之外,这个标志还可有于其它情况,比方线程可能会检查当中断状态 System.out.println(getName()+" was interrupted."+"isInterrupted() "+ isInterrupted()); return; } System.out.println(getName()+" has awakened"); } } ////////////////////////////////// class Joiner extends Thread { private Sleeper sleeper; public Joiner(String name,Sleeper sleeper) { super(name); this.sleeper=sleeper; start(); } @Override public void run() { /** * Joiner 线程将通过在sleeper对象上调用join方法来等待sleeper醒来.在main里面 * 每一个sleeper都有一个joiner,这能够在输出中发现,假设sleeper被 中断或者是正常结束。 * joiner将和sleeper一同结束 * */ try { sleeper.join(); } catch (InterruptedException e) { System.out.println("interrupted"); } System.out.println(getName()+" join completed"); } } ////////////////////////////////// public class Joining { public static void main(String[] args) { //线程1 Sleeper sleepy=new Sleeper("Sleepy",1500), grumpy=new Sleeper("Grumpy",1500); // Joiner Dopey=new Joiner("Dopey",sleepy), doc=new Joiner("doc",grumpy); grumpy.interrupt(); } } /** * 注意,java SE5的java.util.concurrent类库包括诸如CyclicBarrier这种工具。 * 它们可能比最初的线程类库中的join更加合适 * output: Grumpywas interrupted.isInterrupted() false doc join completed Sleepy has awakened Dopey join completed */


    package org.rui.thread.concurrent;
    /**
     * 创建有响应的用户界面
     * 一个关注于运算,所以不能读取控制台输入,还有一个把运算放在任务里单独执行,
     * 此时就能够在进行运算的同一时候监听控制台输入
     * @author lenovo
     *
     */
    
    //无反应的
    class UnresponsiveUI
    {
    	private volatile double d=1;
    	public UnresponsiveUI()throws Exception
    	{
    		while(d>0)
    			d=d+(Math.PI+Math.E);
    			System.in.read();// 永远不会在这里
    	}
    		
    }
    
    
    public class ResponsiveUI extends Thread {
    	private volatile static double d=1;
    	
    	
    	public ResponsiveUI()
    	{
    		setDaemon(true);
    		start();
    	}
    	@Override
    	public void run() {
    		//无限循环,显然程序 不可能到达读取控制台输入的那一行(编译器被欺骗了,相信while的条件使得程序能到达读取控制台输入的那一行)。
    		//假设把建立UnresponsiveUI的那一行的凝视解除掉再执行程序,那么要终止它的话,就仅仅能杀死这个进程
    		while(true)
    			d=d+(Math.PI+Math.E)/d;
    	}
    	
    	////////////////////
    	public static void main(String[] args) throws Exception {
    		//4new UnresponsiveUI();// 必须杀了这个线程
    		new ResponsiveUI();
    		System.in.read();
    		System.out.println(d);//显示上传进度
    		/**
    		 * 要想让程序有响应,就得把计算方案run该方法。因此,它允许处理器等程序。

    * 当您按下‘进’当健康。计算确实可以看到该项目的实施为背景。同时还在等待用户输入。 */ } } /** input: hello output: 在基于停留时间输出: 68130.17629894095 */



  • 相关阅读:
    重写移动端滚动条[iScroll.js核心代码]
    利用canvas将网页元素生成图片并保存在本地
    微信小程序的拖拽、缩放和旋转手势
    设计模式之访问者(visitor)模式
    设计模式之原型(prototype)模式
    设计模式之享元(flyweight)模式
    设计模式之职责链模式
    设计模式之组合(compose)模式
    leetcode16
    校招真题练习013 找零(头条)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4841199.html
Copyright © 2020-2023  润新知