细说多线程之Thread VS Runnable

【线程创建的两种方式】

【线程的生命周期】


● 就绪:创建了线程对象后,调用了线程的start()。
(注意:此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了)。
● 运行:处于就绪状态的线程,一旦获取了CPU资源,便进入到运行状态,开始执行run()里面的逻辑。
● 终止:线程的run()执行完毕,或者线程调用了stop(),线程便进入终止状态。
● 阻塞:一个正在执行的线程在某些情况下,由于某种原因而暂时让出了CPU资源,暂停了自己的执行,
便进入了阻塞状态,如调用了sleep()等。

【Java线程有两类】
用户线程:运行在前台,执行具体任务。程序的主线程、连接网络的子线程等都是用户线程。

守护线程:运行在后台,为其他前台线程服务。
特点:一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作。
应用:数据库连接池中的检测线程;JVM虚拟机启动后的检测程线程。
最常见的守护线程:垃圾回收线程。

如何设置守护线程:
可以通过调用Thread类的setDaemon(true)来设置当前的线程为守护线程。

注意事项:
● setDaemon(true)必须在start()之前调用,否则会抛出IllegalThreadStateException异常。
● 在守护线程中产生的新线程也是守护线程。
● 不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑(中间中断等,这种情况守护线程也就没必要存在了)。

【守护线程代码实例】

 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.io.OutputStream;
 4 import java.util.Scanner;
 5
 7 public class DaemonThreadDemo {
 8
 9     public static void main(String[] args) {
10         System.out.println("进入主线程:" + Thread.currentThread().getName());
11
12         DaemonThread daemonThread = new DaemonThread();
13         Thread thread = new Thread(daemonThread);
14         thread.setDaemon(true);
15         thread.start();
16
17         // 从键盘接收输入,
18         Scanner sc = new Scanner(System.in);
19         sc.next();  // 主线程就会阻塞住了
20         // 一旦我们执行了输入操作,阻塞就会解除掉。主线程会继续执行。然后打印下面一行数据。
21
22         System.out.println("退出主线程:" + Thread.currentThread().getName());
23     }
24 }
25
26 class DaemonThread implements Runnable {
27
28     @Override
29     public void run() {
30         // TODO Auto-generated method stub
31         System.out.println("进入守护线程:" + Thread.currentThread().getName());
32         try {
33             writeToFile();
34         } catch (Exception e) {
35             e.printStackTrace();
36         }
37         System.out.println("退出守护线程:" + Thread.currentThread().getName());
38     }
39
40     private void writeToFile() throws Exception {
41         File filename = new File("b:" + File.separator + "daemon.txt");
42         OutputStream os = new FileOutputStream(filename, true);
43         int count = 0;
44         while(count < 999) {
45             os.write(("\r\nword" + count).getBytes());
46             System.out.println("守护线程" + Thread.currentThread().getName()
47                     + "向文件中写入word" + count++);
48             Thread.sleep(1000);
49         }
50     }
51
52 }

【使用jstack生成线程快照】
作用:生成JVM当前时刻线程的快照(thraddump,即当前进程中所有线程的信息)。

目的:帮助定位程序问题出现的原因,如长时间停顿、CPU占用率过高等。

目录:X:\jdk\bin

时间: 2024-10-09 20:57:01

细说多线程之Thread VS Runnable的相关文章

细说多线程之Thread与Runnable

1:创建线程的两种方式: 继承Thread类 public class MyThread extends Thread { @Override public void run() { }} MyThread mt1 = new MyThread();mt1.start(); 实现Runnable 接口 public class MyThread implements Runnable { @Override public void run() { }} MyThread mt = new MyT

JavaSE学习52:细说多线程之Thread类和Runable接口

一线程创建的两种方式比较 线程创建和启动有两种方式,这里只是列出步骤,不再进行详细解释. (1)继承Thread类 class MyThread extends Thread{ public void run(){ ... } } MyThread mt=new MyThread();//创建线程 mt.start();//启动线程 (2)实现Runnable接口 class MyThread implements Runnable{ public void run(){ ... } } MyT

多线程编程--创建线程之Thread VS Runnable

前面写过一篇基础的创建多线程的博文: 那么本篇博文主要来对比一下这两种创建线程的区别. 继承Thread类: 还拿上篇博客的例子来说: 四个线程各自卖各自的票,说明四个线程之间没有共享,是独立的线程.每个线程平等,没有优先级关系.这三个线程不是一次交替执行,而是三个线程同时被执行的情况下,有的线程被分配时间片的机会多,票被提前卖完,有的线程被分配的时间片的机会少,票迟一些卖完. 故,利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰. 分

多线程之Thread+handler

应用开发中,经常会遇到需要多线程技术的时候,比如UI显示和数据处理分开. 在实际应用中经常会遇到这种场景,我们需要新开一个线程来监听数据状态(数据状态的改变,接收数据,发送数据等等),当发现数据状态改变时通知主线程(通过消息机制发送消息到主线程),主线程接收到通知之后进行处理(自定义消息处理接口). 具体实现如下: 准备线程的创建和消息的处理,这里需要用到android里面的Handler和Thread类,在主线程中添加两个成员Handler.Thread,并实现消息的发送和处理: privat

iOS多线程之Thread

多线程 ? Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周期(主要指创建) 偶尔会用的Thread,一般会用到它的方法:current.name等等 基本使用 创建线程 ``` 创建线程,手动启动 let thread = Thread(target: self, selector: #selector(makeMoney), object: ["Name

JAVA多线程Thread VS Runnable详解

要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件 进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立.所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位.线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源.所以线程是轻量级的

Java多线程之Runable与Thread

Java多线程是Java开发中的基础内容,但是涉及到高并发就有很深的研究可做了. 最近看了下<Java并发实战>,发先有些地方,虽然可以理解,但是自己在应用中很难下手. 所以还是先回顾一下基础知识: Java中的线程 线程的相关知识,了解操作系统的基本都能有所了解. 线程有5中状态,基本变化如图所示: 如何在Java代码中创建线程 众所周知,Java创建线程有两种方式: 1 实现Runable接口 2 继承Thread类 那么这两种方式有什么区别呢? 1 Runable属于接口,所以可以有多个

java多线程之ThreadLocal

ThreadLocal保证数据同步 package Thread.Common; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class Accessor implements Runnable { private final int id; pub

java多线程之Future和FutureTask

Executor框架使用Runnable 作为其基本的任务表示形式.Runnable是一种有局限性的抽象,然后可以写入日志,或者共享的数据结构,但是他不能返回一个值. 许多任务实际上都是存在延迟计算的:执行数据库查询,从网络上获取资源,或者某个复杂耗时的计算.对于这种任务,Callable是一个更好的抽象,他能返回一个值,并可能抛出一个异常.Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. public interface Callab