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
转载请于明显处标明出处