线程的组成部分:
大致结构1.线程基本信息
- 线程ID(Thread ID): 线程的唯一标识符,同一个进程内不同线程ID不会重叠.
- 线程名称: 方便用户识别,系统会自动分配名称,也可以用户指定.
- 线程优先级: 表示线程调度的优先级,优先级越高活的CPU执行的机会就越大.
- 线程状态: 标识线程的执行状态,为新建/就绪/运行/阻塞/结束等状态的一种.
- 其他: 是否为守护线程等等
2.程序计数器
在线程的结构中,程序计数器很重要,它记录着线程下一条指令的代码段内存地址.
3.栈内存信息
在线程的结构中,程序计数器很重要,它记录着线程下一条指令的代码段内存地址.
线程和进程的区别
- 一个进程由一个或者多个线程组成.
- 线程是CPU的最小调度单元,进程是操作系统分配资源的最小单位.
- 一个进程内线程是可以并发执行的.
- 进程之间是相互独立的,但是一个进程内的多个线程并不是完全独立的. 各个线程共享方法区内存,堆内存,系统资源等.
- 进程和线程的上下文切换速度不同. 线程的速度比进程要快得多.
Thread类
一个线程在Java中使用一个Thread实例来描述, Thread类是Java语言的一个重要的基础类, 位于java.lang包中.
常用Thread的属性和方法:
public class Thread implements Runnable {
private long tid; 线程的ID, 由线程自己分配
private volatile String name; 线程的名称, 可以手动设置(setName())
private int priority; 线程的优先级, 默认5, 最小1, 最大10
private ThreadGroup group; 线程所属的线程组
private ClassLoader contextClassLoader; 次线程上下文ClassLoader
private boolean daemon = false; 是否是守护线程
private volatile int threadStatus = 0; 线程的状态. 对应静态枚举类Stete
public void run(){} 线程的功能方法
public synchronized void start(){} 线程准备就绪,等待程序调用run()方法. 异步操作, 调用顺序不代表实际启动的顺序.
public final void stop(){} 终止当前线程, 不建议使用
public static native void sleep(long var0){} 指定毫秒数让正在执行的线程暂停, 具体取决于系统定时器和调度程序的精度和准确性
public final void setPriority(int var1){} 设置优先级, 不一定有用, 影响线程执行优先级的因素很多
public final void setDaemon(boolean var1){} 设置守护线程标识
public static native void yield(){} 放弃当前CPU执行资源,放弃时间不确定
public final native boolean isAlive(){} 判断线程是否处于活动状态. 活动状态: 启动未终止
public final void resume(){} 恢复线程, 不建议使用
public final void suspend(){} 暂停线程, 不建议使用
public void interrupt(){} 中断线程
public static boolean interrupted(){} 测试当前线程是否中断, 并且具备清除状态的功能
public boolean isInterrupted(){} 测试当前线程是否中断
public final void join(){} 等待调用的这个线程终止
public Thread.State getState(){} 获取线程状态
public static enum State {
NEW, 新建
RUNNABLE, 就绪, 运行
BLOCKED, 阻塞
WAITING, 等待
TIMED_WAITING, 计时等待
TERMINATED; 结束
private State() {
}
}
}
创建线程的方法一
- 继承Thread类.
- 重写run()方法, 编写并发业务代码.
public class ThreadDemo extends Thread {
@Override
public void run() {
//并发代码
// TODO
}
public static void main(String args[]) {
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.start();
}
}
创建线程的方法二
- 实现Runnable接口
- 重写run()方法, 编写并发业务代码.
public class RunnableDemo implements Runnable {
@Override
public void run() {
//并发代码
// TODO
}
public static void main(String args[]) {
Thread thread = new Thread(new RunnableDemo(), "runnable测试线程");
thread.start();
}
}
创建线程的方式三
- 实现Callable接口(泛型接口, 函数式接口).
- 实现call()方法, 有返回值.
public class CallableDemo implements Callable<String> {
@Override
public String call() throws Exception {
//并发代码
// TODO
return "OK";
}
public static void main(String args[]) throws ExecutionException, InterruptedException {
CallableDemo callableDemo = new CallableDemo();
FutureTask<String> futureTask = new FutureTask<>(callableDemo);
new Thread(futureTask).start();
String result = futureTask.get();
System.out.println("返回值: " + result);
}
}
网友评论