zoukankan      html  css  js  c++  java
  • Thread线程

    1、什么是线程?

    • 线程( Thread ) 被称作轻量级进程( Lightweight Process ),线程是比进程更小一级的执行单元。
    • 一个进程可以有多个线程,但至少有一个线程(当进程被初始化后,主线程也就被创建了)。

    2、如何实现线程?

    • 继承Tread类。
    • 实现Runnable接口。

    3、Thread 类中的start() 和 run() 方法有什么区别?

    • start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。
    • 当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

    4、Java中的volatile 变量是什么?

    • volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。
    • 而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。
    • 这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。一个 volatile 对象引用可能是 null。

    5、什么是线程安全?

    • 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的。

    6、Java中notify 和 notifyAll有什么区别?

    • notify() : 唤醒在此同步锁上等待的单个线程(选择具有任意性)。
    • notifyAll() : 唤醒在此同步锁上等待的所有线程。

    7、为什么wait, notify 和 notifyAll这些方法不在thread类里面?

    • 由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

    8、Java中interrupted 和 isInterruptedd方法的区别?

    • interrupted:测试当前线程是否已经中断。线程的 中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
    • isInterruptedd:测试线程是否已经中断。线程的 中断状态 不受该方法的影响。

    9、什么是线程池? 为什么要使用它?

    • 在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。
    • 创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长。
    • 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
    • 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存。

    10、如何避免死锁?

    • 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
    • 避免死锁的方法:设置加锁顺序时按同一顺序加锁;设置加锁时限,进程尝试获取锁时加上一定的时限。

    11、死锁和活锁有什么区别?

    • 任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
    • 处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
    • 活锁好比过独木桥,两头的人都在互相谦让,但是都无法过去(进程的状态可以改变但是却不能继续执行)。
    • 死锁好比马路两辆车各自占到了一半道路,都在等待对方让道导致阻塞。

    12、有三个线程T1,T2,T3,怎么确保它们按顺序执行?

    • join方法:Thread .join() (非静态方法)A 线程 内部 调用了 B 线程的 join 方法,将导致 A 线程进入等待状态 ( 阻塞状态 ),等到 B 线程执行结束后,A 线程在继续执行, join不考虑线程的优先级。
    • 启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。

    13、Thread类中的yield方法有什么作用?

    • Thread.yeild()(静态方法)当一个正在运行的线程调用了 Thread.yeild() 后, 当前正在运行的线程将释放 CPU ,  以便于 让 跟 自己具有 同等优先级 或 比 自己优先级高的线程 有机会 获得 CPU , 并且,它本身进入就绪状态 还将参与 下次竞争。

    14、Java多线程中调用wait() 和 sleep()方法有什么不同?

    • wait方法是来自Object 类,sleep来自Thread类。
    • wait方法释放了锁,进入到了等待池中,而sleep方法只是让出来cpu,暂停执行,进入阻塞状态让给其他线程不考虑优先级别,没有释放锁因此时间过后会继续执行。

    牛客网笔试题

    1、以下程序运行的结果为()

    public class Example extends Thread{
         @Override
         public void run(){
            try{
                 Thread.sleep(1000);
                 }catch (InterruptedException e){
                 e.printStackTrace();
                 }
                 System.out.print("run");
         }
         public static void main(String[] args){
                 Example example=new Example();
                 example.run();
                 System.out.print("main");
         }
    }

    正确答案: A  

    A、run main

    B、main run

    C、main

    D、run

    解析:

    • example.run(); // main 调用 t 所引用的实例的 run 方法,执行者是main这个线程,当前线程是main
    • example.start();//调用start启动了t这个线程,让t里面的run方法去执行

    2、假设如下代码中,若t1线程在t2线程启动之前已经完成启动。代码的输出是()

    public static void main(String[]args)throws Exception {
        final Object obj = new Object();
        Thread t1 = new Thread() {
            public void run() {
                synchronized (obj) {
                    try {
                        obj.wait();
                        System.out.println("Thread 1 wake up.");
                    } catch (InterruptedException e) {
                    }
                }
            }
        };
        t1.start();
        Thread.sleep(1000);//We assume thread 1 must start up within 1 sec.
        Thread t2 = new Thread() {
            public void run() {
                synchronized (obj) {
                    obj.notifyAll();
                    System.out.println("Thread 2 sent notify.");
                }
            }
        };
        t2.start();
    }

    正确答案: B  

     A、Thread 1 wake up

           Thread 2 sent notify.

    B、Thread 2 sent notify.

          Thread 1 wake up

    C、A、B皆有可能

    D、程序无输出卡死   

     3、一般有两种用于创建线程的方法,一是(),二是()。

    正确答案: B D  

    A、从Java.lang.Thread类派生一个新的线程类,重写它的runnable()方法

    B、从Java.lang.Thread类派生一个新的线程类,重写它的run()方法

    C、实现Thread接口,重写Thread接口中的run()方法

    D、实现Runnable接口,重写Runnable接口中的run()方法

    4、有关线程的叙述正确的是()

    正确答案: C D 

    A、可以获得对任何对象的互斥锁定

    B、通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定

    C、线程通过使用synchronized关键字可获得对象的互斥锁定

    D、线程调度算法是平台独立的                  

    5、下列程序的运行结果

    public static void main(String args[]) {
        Thread t = new Thread() {
            public void run() {
                pong();
            }
        };
        t.run();
        System.out.print("ping");
    }
    static void pong() {
        System.out.print("pong");
    }

    正确答案: B  
    A、pingpong
    B、pongping
    C、pingpong和pongping都有可能

    6、java Thread中,run方法和start方法的区别,下面说法错误的是?

    正确答案: B 

    A、通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。

    B、他们都可以实现了多线程运行。

    C、run方法是thread的一个普通方法调用。

    D、调用start方法后,一旦得到cpu时间片,就开始执行run()方法。

    7、下面哪个行为被打断不会导致InterruptedException:( )?

    正确答案: E

    A、Thread.join

    B、Thread.sleep

    C、Object.wait

    D、CyclicBarrier.await

    E、Thread.suspend

    解析:

    • java.lang.Object 类的 wait 方法会抛InterruptedException
    • java.lang.Thread 类的 sleep 方法会抛InterruptedException
    • java.lang.Thread 类的 join 方法会抛InterruptedException

    8、Which statement is true?

    void waitForSignal()
    
    {
        Object obj = new Object();
        synchronized(Thread.currentThread())
    
        {
            obj.wait();
            obj.notify();
        }
    }

    正确答案: A  

    A、This code may throw an InterruptedException

    B、This code may throw an IllegalStateException

    C、This code may throw a TimeOutException after ten minutes

    D、This code will not compile unless”obj.wait()”is replaced with”(Thread)obj).wait()”

    E、Reversing the order of obj.wait()and obj.notify()may cause this method to complete normally

    解析:

    • java.lang.Object 类的 wait 方法会抛InterruptedException必须要进行异常捕获
    • 调用wait或者notify方法必须采用当前锁调用,即必须采用synchronized中的对象

    9、下面那些情况可以终止当前线程的运行?

    正确答案: B  

    A、当一个优先级高的线程进入就绪状态时

    B、抛出一个异常时

    C、当该线程调用sleep()方法时

    D、当创建一个新线程时

    10、下列方法中哪个是线程执行的方法? ()

    正确答案: A  

    A、run()

    B、start()

    C、sleep()

    D、suspend()

    参考博客链接

    https://blog.csdn.net/fengshiguang2012/article/details/78037277

    https://baijiahao.baidu.com/s?id=1567515295688177&wfr=spider&for=pc

    转载请于明显处标明出处

    https://www.cnblogs.com/AmyZheng/p/9439134.html

  • 相关阅读:
    Makefile 文件详细规则
    unrar命令
    Vector容器 和 iteration 迭代器
    python的with语句
    anaconda 使用总结
    vim 保存退出命令集
    Tensorflow实例集
    jupyter notebook 使用例子
    tensorflow 安装教程(最佳)
    Ext.NET 4.1.0 搭建页面布局
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/9439134.html
Copyright © 2011-2022 走看看