zoukankan      html  css  js  c++  java
  • Java多线程系列1 线程创建以及状态切换

    我们知道线程线程有三种创建方式

     1实现Runnable接口

     2 继承Thread

     3使用CallableFuture接口创建线程。具体是创建Callable接口的实现类,并实现clall()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为Thread对象的target来创建线程。

      好处:假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这个组合,用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future得到,后面会说道future模式

      代码如下

    public class test {
    	public static void main(String[] args) {
    		MyThread callable = new MyThread();
    		FutureTask<Integer> task = new FutureTask<>(callable);
    		new Thread(task).start();
    		try {
    			Thread.sleep(1000);// 一些其他操作
    			System.out.println(task.get());
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ExecutionException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    
    class MyThread implements Callable<Integer> {
    
    	@Override
    	public Integer call() throws Exception {
    
    		return new Random().nextInt();
    	}
    
    }
    

      

    接下来说说线程的状态切换 

      图片来自网络,侵删。

      

      

    新建状态(New):当线程对象对创建后,即进入了新建状态

    就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,能否在执行需要看待cpu的调度。

    运行状态(Running):cpu调度到该线程,该线程就会运行。

    阻塞状态(Blocked):线程因为某些原因,暂时被挂起,暂时不继续执行的状态。常见的有以下三种

    1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

    2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

    3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

    死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

    请注意:::::

    只有使用yield()方法以后 线程从运行到就绪状态

    无论使用 wait(),synchronized 关键词还是sleep() join() 都是先进入阻塞 当满足了相关条件以后,在进入就绪状态

    最后要说明的是,关于线程的死亡  可以看到已经废弃了stop方法,因为使用了该方法会释放所有锁,引发数据安全问题

    实际开发中,我们要结束一个线程,一般通过设置一个Boolean标志位来 如下面代码所示

    public class test {
    	public static void main(String[] args) {
    		MyThread t = new MyThread();
    		t.start();
    		try {
    			Thread.sleep(10);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		t.setExit();
    	}
    
    }
    
    class MyThread extends Thread {
    	private volatile boolean exit = true;
    	@Override
    	public void run() {
    		while (exit) {
    			System.out.println("hello");
    		}
    	}
    
    	public void setExit() {
    		this.exit = false;
    	}
    }
    

      

  • 相关阅读:
    记录一次对接XX支付SDK过程中报错问题
    接口回调(重点是理解)
    jQuery form插件的使用--ajaxForm()和ajaxSubmit()的可选参数项对象
    如何通过submit提交form表单获取后台传来的返回值
    Unsupported major.minor version 52.0
    js获取input file路径改变图像地址
    html 横线的代码
    FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
    UUID不失精度,长度改进
    java Date时间的各种转换方式和Mysql存时间类型字段的分析
  • 原文地址:https://www.cnblogs.com/javabigdata/p/6822502.html
Copyright © 2011-2022 走看看