首页 > 代码库 > JAVA多线程之快速解读
JAVA多线程之快速解读
JAVA线程 :主要有:继承Thread类和实现Runnble接口两种实现方式。
1:继承Thread类
1 public class ThreadDemo extends Thread{ 2 3 @Override 4 public void run(){ 5 System.out.println("hellWorld"); 6 } 7 8 public static void main(String[] args) { 9 ThreadDemo demo = new ThreadDemo(); 10 demo.start(); 11 } 12 13 }
使用方式:创建线程类对象 demo,使用对象demo.start();启动线程
2:实现Runnble接口
1 public class ThreadDemo implements Runnable{ 2 3 @Override 4 public void run(){ 5 System.out.println("hellWorld"); 6 } 7 8 public static void main(String[] args) { 9 ThreadDemo demo = new ThreadDemo(); 10 Thread th = new Thread(demo); 11 th.start(); 12 } 13 14 }
使用方式:创建线程类对象 demo,使用线程实例将线程对象传入线程实例,使用线程实例调用th.start();(例如12306网站买票,就是针对同一资源的处理)
优点:Runnble方式可以避免Thread方式由于java单继承特性带来的缺陷
Runnble的代码可以被多个线程(Thread实例)共享,适合于多个线程处理同一资源的情况
线程的生命周期
java线程有两大类
用户线程 :运行在前台,执行具体的任务
特点:程序的主线程,连接网络的子线程都是用户线程
守护线程 :运行在后台,为其他前台线程服务
特点:一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作(可用于对数据库连接池的监控等)
使用setDaemon(true)必须在线程启动start()方法之前调用,否则会抛出IllegalThreadStateException异常。在守护线程中产生的新线程也是守护线程, 不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑。
1 package daemon; 2 import java.io.File; 3 import java.io.FileOutputStream; 4 import java.io.OutputStream; 5 import java.util.Scanner; 6 class DaemonThread implements Runnable { 7 @Override 8 public void run() { 9 System.out.println("进入守护线程" + Thread.currentThread().getName()); 10 writeToFile(); 11 System.out.println("进入守护线程" + Thread.currentThread().getName()); 12 } 13 public void writeToFile() { 14 try { 15 File filename = new File("D:" + File.separator + "daemon.txt"); 16 OutputStream os = new FileOutputStream(filename, true); 17 int count = 0; 18 while (count < 999) { 19 os.write(("\r\nword" + count).getBytes()); 20 System.out.println("守护线程" + Thread.currentThread().getName() 21 + "向文件中写入了word" + count++); 22 Thread.sleep(1000); 23 } 24 } catch (Exception e) { 25 e.printStackTrace(); 26 } 27 System.out.println("退出守护线程"+Thread.currentThread().getName()); 28 } 29 } 30 public class DaemonThreadDeamo { 31 public static void main(String[] args) { 32 System.out.println("进入主线程"+Thread.currentThread().getName()); 33 DaemonThread daemonThread = new DaemonThread(); 34 Thread thread = new Thread(daemonThread); 35 thread.setDaemon(true); 36 thread.start(); 37 Scanner scanner = new Scanner(System.in); 38 scanner.next(); 39 System.out.println("退出主线程"+Thread.currentThread().getName()); 40 } 41 }
启动主线程main方法,会使用thread.setDaemon() 启动守护线程
实现原理是(main)主线程等待控制台的录入,键盘录入后堵塞主线程,守护线程会随之被jvm所释放。
在写博客之前我有一直在写笔记,由于笔记本不是落在家就是落在公司,无法坚持下去。看了这么久的博客,终于想到可以通过写博客来学习,并且我认为一个IT新人可以通过写博客学习it知识。
借用我的启蒙老师的一句话:Change the world by program.
JAVA多线程之快速解读