美文网首页
一、基础1

一、基础1

作者: 小菜鸡的看书过程 | 来源:发表于2019-06-08 17:28 被阅读0次

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

    相关文章

      网友评论

          本文标题:一、基础1

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