Java基础系列 |
您所在的位置:网站首页 › 宠物技能书怎么获得 › Java基础系列 |
Java基础系列
第一章 创建Thread的6种方式和线程常用方法 第二章 synchronized用法和解析 第三章 Netty的NIO通讯讲解 读完本章节,您将掌握如何创建线程和线程的常用方法。 一、创建线程 1. 通过Thread子类创建线程 public class MyThread extends Thread { @Override public void run() { System.out.println("通过Thread子类创建线程"); } } //通过Thread子类创建线程 public void createThread1() { MyThread t = new MyThread(); t.start(); } 2. 使用runnable创建线程 2.1 通过函数式接口创建线程 //使用runnable创建线程-函数式接口 public void createThread2() { Thread t = new Thread(() -> System.out.println("使用runnable创建线程1")); t.start(); } 2.2 通过内部匿名类创建线程 //使用runnable创建线程-内部匿名类 public void createThread3() { Thread t = new Thread(new Runnable() { @Override public void run() { System.out.println("使用runnable创建线程2"); } }); t.start(); } 2.3 通过runnable子类创建线程 public class MyRunnable implements Runnable { @Override public void run() { System.out.println("使用runnable创建线程3"); } } //使用runnable创建线程-runnable子类 public void createThread4() { MyRunnable runnable = new MyRunnable(); Thread t = new Thread(runnable); t.start(); } 3. 使用匿名内部类创建线程 //使用匿名内部类创建线程 public void createThread5() { Thread t = new Thread() { @Override public void run() { System.out.println("使用匿名内部类创建线程"); } }; t.start(); } 4. 使用线程池创建线程 @Resource private ThreadPoolExecutor threadPoolExecutor; @Bean public ThreadPoolExecutor executor() { int processors = Runtime.getRuntime().availableProcessors(); return new ThreadPoolExecutor( Math.max(processors * 4, 6), Math.max(processors * 4, 8), 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque(100000), runnable -> { Thread r = new Thread(runnable); r.setName("thread-"); return r; } ); } //使用线程池创建线程 public void createThread6() { threadPoolExecutor.execute(() -> System.out.println("使用线程池创建线程")); } 二、线程常用静态方法 //线程常用静态方法 public void threadStaticMethod() throws InterruptedException { //将当前线程设为让步状态,表示当前线程愿意让出CPU资源使得其他线程执行。 //将当前线程设为待运行就绪状态,再从线程池中取出可运行的线程执行后续逻辑,有可能取到刚放回去的当前线程。 Thread.yield(); //线程休眠(阻塞)100ms Thread.sleep(100L); //获取当前线程的信息 Thread.currentThread(); //返回当前线程的线程组中活动线程的数量。(返回的值只是一个估计值) Thread.activeCount(); //获取线程中断标志位 Thread.interrupted(); } 三、线程实例常用方法 //线程实例常用方法 public void threadMethod() throws InterruptedException { Thread t = new Thread(() -> System.out.println("线程实例常用方法")); //当前线程等待t线程执行直到t执行完成 //要让join方法正常生效,调用join方法的线程对象必须已经调用了start()方法并且未进入终止状态。 //常见面试题:现在有T1、T2,你怎样保证T2在T1执行完之后执行,就可以在T2中调用t1.join()实现。 t.join(); //挂起当前线程和释放synchronized同步锁 //wait()和notify()、notifyAll()都是java.lang.Object的方法。 t.wait(); //设为后台线程(守护线程) //java线程分为后台线程与前台线程,其中后台线程不会影响到进程的退出,而前台线程会影响进程的退出。 //比如有线程t1与线程t2,当这两个线程为前台线程时,main方法执行完毕时,t1与t2不会立即退出,要等到线程执行完毕,整个进程才会退出,反之,当这两个线程为后台线程时,main方法执行完毕时,t1与t2线程被强制结束,整个进程也就结束了。 t.setDaemon(true); //使用interrupt方法修改线程中断标志位为true,默认为false t.interrupt(); //获取线程中断标志位 //在线程run()方法里可以通过Thread.currentThread().isInterrupted()获取标志位。但是调用interrupt方法遇到线程run()方法里调用 wait/join/sleep 等方法而阻塞线程时会使sleep等方法抛出异常,并且中断标志位不会修改为true //可通过静态方法Thread.interrupted()代替,但注意:一个程序里Thread.interrupted()是共用的。 t.isInterrupted(); //以同步方式执行方法,不创建新线程 t.run(); //创建线程并执行run方法 t.start(); } 四、线程基本状态NEW: 初始化状态。初始化线程对象,这时没有执行start方法,java内部的状态,与进程中的状态无关。 RUNNABLE: 就绪状态。分两种:RUNNABLE运行中,READY待运行。 BLOCKED: 阻塞状态。线程正在等待锁释放而引起的阻塞状态(synchronized加锁)。 WAITING: 等待状态。线程正在等待等待唤醒而引起的阻塞状态(wait方法使线程等待唤醒)。 TIMED_WAITING: 超时等待状态。在一段时间内处于阻塞状态,通常是使用sleep或者join(带参数)方法引起。 TERMINATED:终止状态。Thread对象还存在,但是关联的线程已经工作完成了,java内部的状态,与进程中的状态无关。 读完本章节,您已经掌握如何创建线程和线程的常用方法。可以动手按照示例代码自己敲下进行测试和巩固。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |