线程创建
来源:互联网 发布:遥远的救世主商战 知乎 编辑:程序博客网 时间:2024/05/20 20:21
线程创建的三种方式
第一种创建线程的方式
继承Thread类并重写run方法来定义线程要执行的任务
class MyThread extends Thread{ public void run(){ for(int i=0;i<1000;i++){ System.out.println("你好啊!"); } }}
第一种创建线程的方式有两个不足:
1:由于java是单继承,那么当继承了Thread后就无法再继承其他类.
2:由于继承Thread后重写run方法规定了线程执行的任务,这导致线程与任务有一个必然的耦合关系,不利于线程的重用.
第二种创建线程的方式
实现Runnable接口并重写run方法.
class MyRunnable implements Runnable{ public void run(){ for(int i=0;i<1000;i++){ System.out.println("你好啊"); } }}
第三种创建线程的方式
FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new Callable() { @Override public Boolean call() throws Exception { return new File("111.txt").exists(); }});Thread t2 = new Thread(futureTask);t2.start();try { //返回结果,最长等待5S Boolean b = futureTask.get(5,TimeUnit.SECONDS);} catch (InterruptedException e) { //中断 e.printStackTrace();} catch (ExecutionException e) { //停止 e.printStackTrace();} catch (TimeoutException e) { //超时 e.printStackTrace();}
类似于Runnable,实现Callable接口,实现call方法,创建线程,通过FutureTask获取返回结果,此方式可以获取线程返回值。
线程启动
启动线程要指定start方法,而不是直接调用run方法.run方法是线程要执行的任务.当线程的start方法被调用后,线程进入runnable状态,一旦获取cpu时间,run方法会自动被调用.
public class ThreadDemo { public static void main(String[] args) { Thread t1 = new MyThread(); t1.start(); Runnable r = new MyRunnable(); Thread t2 = new Thread(r); t2.start(); }}
获取线程信息
public static void main(String[] args) { Thread main = Thread.currentThread(); //获取当前线程 long id = main.getId(); System.out.println("id:"+id); String name = main.getName(); System.out.println("name:"+name); int priority = main.getPriority(); System.out.println("优先级:"+priority); boolean isAlive = main.isAlive(); System.out.println("是否存活:"+isAlive); boolean isDaemon = main.isDaemon(); System.out.println("是否为守护线程:"+isDaemon); boolean isInterrupted = main.isInterrupted(); System.out.println("是否被中断:"+isInterrupted);}
线程优先级
线程的时间片分配完全听线程调度的,线程只能被动的被分配时间,对于线程调度的工作不能干预,但是可以通过提高线程的优先级来达到尽可能干预的目的。理论上,优先级越高的线程,获取CPU时间片的次数就越多。
守护线程
又称为后台线程。当一个进程中的所有前台线程都结束时,进程就要结束,若还有后台线程运行,那么后台线程会被强制结束。
Thread t1 = new MyThread();t1.setDaemon(true); //设置为后台线程,并且要在start前调用t1.start();
线程阻塞
线程提供的静态方法sleep(long ms)可以使运行该方法的线程进入阻塞状态指定毫秒。超时后线程会自动回到runnable状态。
join()方法可以使调用该方法的线程进入阻塞状态,直到该方法所属线程完成工作才会解除调用该方法线程的阻塞状态。
public static void main(String[] args) { Thread t1 = new Thread(){ public void run(){ try{ Thread.sleep(5000); //阻塞5s }catch(InterruptedException e){ } System.out.println("t1执行完毕!"); } }; Thread t2 = new Thread(){ public void run(){ try{ t1.join(); //等待t1执行完毕 }catch(InterruptedException e){ } System.out.println("t2执行完毕!"); } }; t1.start(); t2.start();}
join方法一般用来完成多个线程之间的同步工作问题。
- 创建线程
- 创建线程
- 创建线程
- 线程创建
- 线程创建
- 创建线程
- 创建线程
- 创建线程
- 创建线程
- 线程创建
- 创建线程
- 线程创建
- 创建线程
- 创建线程
- 创建线程
- 线程创建
- 创建线程
- 线程创建
- jQuery实现form表单reset按钮重置清空表单功能
- HTTP协议详解(1)
- Struts2之文件上传(单文件/多文件)
- Java Log4j 简单介绍
- Transaction 那点事儿--醍醐灌顶
- 线程创建
- c++ protobuf
- 【学习笔记01】java面向对象-类、对象
- 20170421康拓普面试题
- thrift安装过程报错处理
- input子系统二 驱动层input设备注册
- Android 请求webservice
- Gradle下载及环境配置
- PM2的安装和使用简介