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

原文地址:https://www.cnblogs.com/AmyZheng/p/9439134.html