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
Thread线程的更多相关文章
- 学习接水系统(java+thread线程)
(一)项目框架分析 对于学生并发接水项目,根据面向对象的思想,需要创建两个对象,即学生和水龙头. 接下来主要讲解不排队接水和排队接水两张情况. 项目的目录文件如下: (二)不排队接水 假设有四个学生小 ...
- QT5 Thread线程
QT5 Thread线程继承QThread方式 一.首先分析一下 QTimer Class与 Sleep()函数之间的秘密 QTimer *t = new QTimer(*parent); //创建Q ...
- Thread线程join方法自我理解
Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...
- java 并发(三)---Thread 线程
Thread 的状态 线程共有五种状态.分别是: (1)新建 (2)就绪 (3)运行 (4)阻塞 (5)死亡 ,下面列列举的状态需要结合状态示意图更好理解. 新建状态(New): 新创建了一个线程对 ...
- c++11中关于`std::thread`线程传参的思考
关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...
- Thread 线程池
Thread 线程池: 当使用多个较短存活期的线程有利时,运用线程池技术可以发挥作用.运用这一技术时,不是为每个任务创建一个全新的线程,而可以从线程池中抽出线程,并分配给任务.当线程完成任务后,再把它 ...
- Thread线程的基础知识及常见疑惑点
引言 相信各位道友在平时工作中已经很少直接用到Thread线程类了,现在大多是通过线程池或者一些多线程框架来操作线程任务,但我觉得还是有必要了解清楚Thread线程类中各种方法的含义,了解了底层才能更 ...
- Thread线程框架学习
原文:https://www.cnblogs.com/wangkeqin/p/9351299.html Thread线程框架 线程定义:线程可以理解为一个特立独行的函数.其存在的意义,就是并行,避免了 ...
- std::thread线程库详解(2)
目录 目录 简介 最基本的锁 std::mutex 使用 方法和属性 递归锁 std::recursive_mutex 共享锁 std::shared_mutex (C++17) 带超时的锁 总结 简 ...
- Thread线程控制之sleep、join、setDaemon方法的用处
Thread线程控制之sleep.join.setDaemon方法的用处 1. sleep方法 public static void sleep(long millis) throws Interru ...
随机推荐
- 整合SSM2
SSM框架的搭建 注意: 1.SpringMVC和Spring 不需要什么特殊的配置就可以结合 2.MyBatis和Spring 1)需要引入额外的jar包:m ...
- 用python实现密码校验程序
密码需要符合下面的要求: 8个字符以上,包含数字,大小写,开头不能为特殊字符. #! /usr/bin/pythonimport re password = str(input()) def lenO ...
- selenium的显示等待、隐式等待
转载:https://www.cnblogs.com/mabingxue/p/10293296.html Selenium显示等待和隐式等待的区别1.selenium的显示等待原理:显示等待,就是明确 ...
- mysql5.7导出数据提示--secure-file-priv选项问题的解决方法
mysql可使用 into outfile 参数把表中数据导出到csv,例如可用以下命令把user表的数据导出到user.csv select * from user into outfile '/t ...
- 【转载】Windows环境下JNI的实现实例
转自:http://blog.csdn.net/jjunjoe/article/details/6987183 一.关于JNI: JNI(Java Native Interface):Java本地调用 ...
- C++算法导论第九章O(n)期望选择序列第i小的数字
#include<iostream> #include<vector> #include<algorithm> #include<time.h> usi ...
- JAVA中fail-fast机制
在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList: 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证.快速失 ...
- cef源码分析之cefsimple
下面是cefsimple的入口代码,主要分成两个部分 // Entry point function for all processes. int APIENTRY wWinMain(HINSTANC ...
- 闲来无事.gif
- PHP 源码 —— is_array 函数源码分析
is_array 函数源码分析 本文首发于 https://github.com/suhanyujie/learn-computer/blob/master/src/function/array/is ...