JAVA多线程之快速解读

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
View Code

 

    使用方式:创建线程类对象 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 }
View Code

 

  使用方式:创建线程类对象 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 }
View Code

    启动主线程main方法,会使用thread.setDaemon() 启动守护线程

    实现原理是(main)主线程等待控制台的录入,键盘录入后堵塞主线程,守护线程会随之被jvm所释放。

 

    在写博客之前我有一直在写笔记,由于笔记本不是落在家就是落在公司,无法坚持下去。看了这么久的博客,终于想到可以通过写博客来学习,并且我认为一个IT新人可以通过写博客学习it知识。

 

借用我的启蒙老师的一句话:Change the world by program.

 

以上是关于JAVA多线程之快速解读的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程与并发模型之锁

并发之volatile底层原理

java多线程解读一(基础篇)

java多线程解读一(基础篇)

java多线程解读二(内存篇)

java 多线程之取消与关闭