美文网首页多线程
Java中的线程

Java中的线程

作者: Duanty | 来源:发表于2021-09-14 10:30 被阅读0次
    线程的组成部分:
    大致结构
    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<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);
        }
    }
    

    相关文章

      网友评论

        本文标题:Java中的线程

        本文链接:https://www.haomeiwen.com/subject/bnaxgltx.html