Thread类
一个线程在Java中使用一个Thread实例来描述。Thread类是Java语言的一个重要的基础类,位于java.lang包中。
Thread类主要属性
| 属性 | 简介 |
|---|---|
| id | 线程id |
| name | 线程名称 |
| priority | 优先级 |
| daemon | 是否为守护线程 提供后台服务的线程 |
| threadStatus | 线程状态 new runable blocked waiting time_waiting terminated |
四种创建线程的方法
- 继承thread 重写run方法 。
public class CreateDemo {
public static Integer plus =0;
//继承thread
public static class ThreadDemo1 extends Thread{
@Override
public void run() {
for (int i = 0; i <10 ; i++) {
plus++;
System.out.println("第"+i +"累加");
}
}
}
@Test
public void testEX() throws InterruptedException {
ThreadDemo1 demo1 = new ThreadDemo1();
demo1.start();
}
- 实现Runable接口,作为实际参数传递给Thread构造器,创建线程
public static class RunnableDemo implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"第"+i+"次轮询");
}
}
}
@Test
public void testRunnable(){
for (int i = 0; i < 5; i++) {
new Thread(new RunnableDemo()).start();
}
}
- 使用Callable和FutureTask创建可有返回值的线程,实现Callable接口,作为FutureTask的构造方法入参,创建FutureTask,FutureTask实例作为Thread构造方法入参,创建线程实例。

public static class CallableDemo implements Callable<Long>{
@Override
public Long call() throws Exception {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
System.out.println(Thread.currentThread().getName()+i+"次轮询·");
}
Thread.sleep(100);
long endTime = System.currentTimeMillis();
return endTime-startTime;
}
}
@Test
public void testCallable() {
FutureTask<Long> futureTask = new FutureTask<>(new CallableDemo());
Thread thread = new Thread(futureTask);
thread.start();
try {
Long result = futureTask.get();
System.out.println("执行结果为" + result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
- 线程池方法创建线程
ExecutorService是Java提供的一个线程池接口,每次我们在异步执行target目标任务的时候,可以通过ExecutorService线程池实例去提交或者执行。Executors工厂类可创建固定数量的线程池实例。

@Test
public void testPool() throws ExecutionException, InterruptedException {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
Future<Long> submit = threadPool.submit(new CallableDemo());
Future<?> future = threadPool.submit(new RunnableDemo());
System.out.println("callable结果"+submit.get());
System.out.println("runnable结果"+future.get());
}
线程基本操作
| 方法 | 简介 |
|---|---|
| sleep | 休眠,只能自己醒来,不能从外部唤醒 |
| interrupt | 如果此线程处于阻塞状态,立马推出阻塞抛出异常intereruptException,线程处理捕获此异常做处理,然后线程退出;如果此线程正在运行,线程不会受任何影响,继续运行,仅仅是线程的中断标记为true |
| jion | A线程依赖B线程,B线程执行jion方法合并到A,等待B线程完成或超时,A线程处于等待状态 |
| yied | 让目前正在执行的线程放弃当前操作,让出cpu权限,使cpu执行其他线程,不阻塞该线程,只是让线程转入就绪状态,等待cpu重新调度。 |
| deamon | 实例属性daemon为布尔类型,默认为false表示为用户线程,实例方法setDaemon()此方法标记为守护线程或用户线程。 |
守护线程
守护线程也成为后台线程,专门在程序运行过程中在后台提供某种通用服务,守护线程和用户线程的本质区别是二者与jvm虚拟机进程终止的方向不同,用户线程和jvm进程是主动关系,如果用户线程全部终止,jvm虚拟机进程随之终止,守护线程和jvm进程是被动关系,如果jvm进程终止,守护线程随之终止。
守护线程必须在启动前将其状态设置为true,启动后不能将用户线程设置为守护线程,否则jvm抛出interruptedException异常。
守护线程存在被jvm强行终止的风险,所以尽量不去访问系统资源;
守护线程创建的线程也是守护线程。
本文介绍了Java中线程的创建和管理,包括继承Thread、实现Runnable、使用Callable和FutureTask以及利用线程池ExecutorService创建线程的方法。同时,讨论了线程的基本操作如sleep、interrupt、join和yield,以及守护线程的概念和特性。

被折叠的 条评论
为什么被折叠?



