一、基础1

cpu核心数和线程数的欢喜

  • 核心数:线程数 = 1:1。 使用了超线程技术后 --> 1:2

cpu时间偏轮转机制

  • 又称RR调度,会导致上下文切换

什么是进程和线程

  • 进程:程序运行资源分配的最小单位,一个进程内部有多个线程,会共享这个进程的资源
  • 线程:cpu调度的最小单位,必须依赖进程而存在

并行、并发

  • 并行:同一时刻,可以同时处理事情的能力
  • 并发:与单位时间有关,在单位时间内可以处理事情的能力

并发好处和问题

  • 好处:充分利用cpu资源、加快用户响应的时间,程序模块化,异步化
  • 问题:
    1. 线程共享资源,存在冲突;
    2. 容易导致死锁;
    3.启用太多线程,就有搞垮机器的可能;

新启线程的方式(3种)

  • 继承Thread 重写run方法
public class NewThread  {


    static class StartThread extends Thread {
        @Override
        public void run() {
            System.out.println("extends Thread");
        }
    }

    public static void main(String []args) {
        Thread thread = new StartThread();
        thread.start();;
    }

}
  • 实现 Runnable接口 实现run方法
public class NewThread  {


    static class StartThread implements Runnable {
        @Override
        public void run() {
            System.out.println("implements Runnable");
        }
    }

    public static void main(String []args) {
        Thread thread = new Thread(new StartThread());
        thread.start();;
    }

}
  • 实现Callable接口的call方法

这个和runnable区别是可以得到返回值的,可通过featureTask.get() 取到
因为Thread方法没有接收callable的构造方法,
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
所以 我们可以拿 FutureTask 包装一下 Callable 然后传给Thread

public class NewThread  {


    //有返回值
    static class StartThread implements Callable<String> {

        @Override
        public String call() throws Exception {
            return "implements Callable";
        }
    }

    public static void main(String []args) throws ExecutionException, InterruptedException {
        FutureTask <String> featureTask = new FutureTask<>(new StartThread());
        Thread thread = new Thread(featureTask);
        thread.start();
        System.out.print(featureTask.get());
    }

}
  • 线程安全的停止

线程自然终止,自然执行完或抛出未处理异常
stop 会导致线程不会正确释放资源、resume()、supend()容易导致死锁已经不建议使用

  • java线程是协作式,而非抢占式
  • 调用一个线程的interrupt()方法,并不是强行关闭这个线程,只是跟这个线程打个招呼,将线程的终端标志为true,线程是否终端,还是要由线程本身决定
    • 方法如果抛出InterruptedException,线程的终端标志位会被复位成false,如果确实是需要终端线程,要求我们自己在catch语句块里再次调用interrupt()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容