一、基础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 implements RunnableFuture
public interface RunnableFuture extends Runnable, Future
所以 我们可以拿 FutureTask 包装一下 Callable 然后传给Thread

public class NewThread  {


    //有返回值
    static class StartThread implements Callable {

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

    public static void main(String []args) throws ExecutionException, InterruptedException {
        FutureTask  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()

你可能感兴趣的:(一、基础1)