Java中的线程

线程的组成部分:
大致结构
1.线程基本信息
  • 线程ID(Thread ID): 线程的唯一标识符,同一个进程内不同线程ID不会重叠.
  • 线程名称: 方便用户识别,系统会自动分配名称,也可以用户指定.
  • 线程优先级: 表示线程调度的优先级,优先级越高活的CPU执行的机会就越大.
  • 线程状态: 标识线程的执行状态,为新建/就绪/运行/阻塞/结束等状态的一种.
  • 其他: 是否为守护线程等等
2.程序计数器

在线程的结构中,程序计数器很重要,它记录着线程下一条指令的代码段内存地址.

3.栈内存信息

在线程的结构中,程序计数器很重要,它记录着线程下一条指令的代码段内存地址.

线程和进程的区别

  1. 一个进程由一个或者多个线程组成.
  2. 线程是CPU的最小调度单元,进程是操作系统分配资源的最小单位.
  3. 一个进程内线程是可以并发执行的.
  4. 进程之间是相互独立的,但是一个进程内的多个线程并不是完全独立的. 各个线程共享方法区内存,堆内存,系统资源等.
  5. 进程和线程的上下文切换速度不同. 线程的速度比进程要快得多.

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() {
        }
    }
}

创建线程的方法一

  1. 继承Thread类.
  2. 重写run()方法, 编写并发业务代码.
public class ThreadDemo extends Thread {

    @Override
    public void run() {
        //并发代码
        // TODO
    }
    
    public static void main(String args[]) {
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.start();
    }
}

创建线程的方法二

  1. 实现Runnable接口
  2. 重写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();
    }
}

创建线程的方式三

  1. 实现Callable接口(泛型接口, 函数式接口).
  2. 实现call()方法, 有返回值.
public class CallableDemo implements Callable {
    @Override
    public String call() throws Exception {
        //并发代码
        // TODO
        return "OK";
    }

    public static void main(String args[]) throws ExecutionException, InterruptedException {
        CallableDemo callableDemo = new CallableDemo();
        FutureTask futureTask = new FutureTask<>(callableDemo);
        new Thread(futureTask).start();
        String result = futureTask.get();
        System.out.println("返回值: " + result);
    }
}

你可能感兴趣的:(Java中的线程)