赞
踩
说明在前:
在文档中对所有的面试题都进行了难易程度和出现频率的等级说明
星数越多代表权重越大,最多五颗星(☆☆☆☆☆) 最少一颗星(☆)
难易程度:☆☆
出现频率:☆☆☆
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。
当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
一个进程之内可以分为一到多个线程。
一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。在 windows 中进程是不活动的,只是作为线程的容器
二者对比
难易程度:☆
出现频率:☆
单核CPU
一般会将这种线程轮流使用CPU的做法称为并发(concurrent)
多核CPU
每个核(core)都可以调度运行线程,这时候线程可以是并行的。
并发(concurrent)是同一时间应对(dealing with)多件事情的能力
并行(parallel)是同一时间动手做(doing)多件事情的能力
举例:
难易程度:☆☆
出现频率:☆☆☆☆
参考回答:
共有四种方式可以创建线程,分别是:继承Thread类、实现runnable接口、实现Callable接口、线程池创建线程
详细创建方式参考下面代码:
① 继承Thread类
- public class MyThread extends Thread {
-
- @Override
- public void run() {
- System.out.println("MyThread...run...");
- }
-
-
- public static void main(String[] args) {
-
- // 创建MyThread对象
- MyThread t1 = new MyThread() ;
- MyThread t2 = new MyThread() ;
-
- // 调用start方法启动线程
- t1.start();
- t2.start();
-
- }
-
- }
② 实现runnable接口
- public class MyRunnable implements Runnable{
-
- @Override
- public void run() {
- System.out.println("MyRunnable...run...");
- }
-
- public static void main(String[] args) {
-
- // 创建MyRunnable对象
- MyRunnable mr = new MyRunnable() ;
-
- // 创建Thread对象
- Thread t1 = new Thread(mr) ;
- Thread t2 = new Thread(mr) ;
-
- // 调用start方法启动线程
- t1.start();
- t2.start();
-
- }
-
- }
③ 实现Callable接口
- public class MyCallable implements Callable<String> {
-
- @Override
- public String call() throws Exception {
- System.out.println("MyCallable...call...");
- return "OK";
- }
-
- public static void main(String[] args) throws ExecutionException, InterruptedException {
-
- // 创建MyCallable对象
- MyCallable mc = new MyCallable() ;
-
- // 创建F
- FutureTask<String> ft = new FutureTask<String>(mc) ;
-
- // 创建Thread对象
- Thread t1 = new Thread(ft) ;
- Thread t2 = new Thread(ft) ;
-
- // 调用start方法启动线程
- t1.start();
-
- // 调用ft的get方法获取执行结果
- String result = ft.get();
-
- // 输出
- System.out.println(result);
-
- }
-
- }
④ 线程池创建线程
- public class MyExecutors implements Runnable{
-
- @Override
- public void run() {
- System.out.println("MyRunnable...run...");
- }
-
- public static void main(String[] args) {
-
- // 创建线程池对象
- ExecutorService threadPool = Executors.newFixedThreadPool(3);
- threadPool.submit(new MyExecutors()) ;
-
- // 关闭线程池
- threadPool.shutdown();
-
- }
-
- }
难易程度:☆☆
出现频率:☆☆☆
参考回答:
难易程度:☆☆
出现频率:☆☆
start(): 用来启动线程,通过该线程调用run方法执行run方法中所定义的逻辑代码。start方法只能被调用一次。
run(): 封装了要被线程执行的代码,可以被调用多次。
难易程度:☆☆☆
出现频率:☆☆☆☆
线程的状态可以参考JDK中的Thread类中的枚举State
- public enum State {
- /**
- * 尚未启动的线程的线程状态
- */
- NEW,
-
- /**
- * 可运行线程的线程状态。处于可运行状态的线程正在 Java 虚拟机中执行,但它可能正在等待来自 * 操作系统的其他资源,例如处理器。
- */
- RUNNABLE,
-
- /**
- * 线程阻塞等待监视器锁的线程状态。处于阻塞状态的线程正在等待监视器锁进入同步块/方法或在调 * 用Object.wait后重新进入同步块/方法。
- */
- BLOCKED,
-
- /**
- * 等待线程的线程状态。由于调用以下方法之一,线程处于等待状态:
- * Object.wait没有超时
- * 没有超时的Thread.join
- * LockSupport.park
- * 处于等待状态的线程正在等待另一个线程执行特定操作。
- * 例如,一个对对象调用Object.wait()的线程正在等待另一个线程对该对象调用Object.notify() * 或Object.notifyAll() 。已调用Thread.join()的线程正在等待指定线程终止。
- */
- WAITING,
-
- /**
- * 具有指定等待时间的等待线程的线程状态。由于以指定的正等待时间调用以下方法之一,线程处于定 * 时等待状态:
- * Thread.sleep
- * Object.wait超时
- * Thread.join超时
- * LockSupport.parkNanos
- * LockSupport.parkUntil
- * </ul>
- */
- TIMED_WAITING,
-
- /**
- * 已终止线程的线程状态。线程已完成执行
- */
- TERMINATED;
- }
状态之间是如何变化的
分别是
难易程度:☆☆
出现频率:☆☆☆
在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。
代码举例:
为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成
- public class JoinTest {
-
- public static void main(String[] args) {
-
- // 创建线程对象
- Thread t1 = new Thread(() -> {
- System.out.println("t1");
- }) ;
-
- Thread t2 = new Thread(() -> {
- try {
- t1.join(); // 加入线程t1,只有t1线程执行完毕以后,再次执行该线程
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("t2");
- }) ;
-
-
- Thread t3 = new Thread(() -> {
- try {
- t2.join(); // 加入线程t2,只有t2线程执行完毕以后,再次执行该线程
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("t3");
- }) ;
-
- // 启动线程
- t1.start();
- t2.start();
- t3.start();
-
- }
-
- }
难易程度:☆☆
出现频率:☆☆
notifyAll:唤醒所有wait的线程
notify:只随机唤醒一个 wait 线程
- package com.itheima.basic;
-
- public class WaitNotify {
-
- static boolean flag = false;
- static Object lock = new Object();
-
- public static void main(String[] args) {
-
- Thread t1 = new Thread(() -> {
- synchronized (lock){
- while (!flag){
- System.out.println(Thread.currentThread().getName()+"...wating...");
- try {
- lock.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- System.out.println(Thread.currentThread().getName()+"...flag is true");
- }
- });
-
- Thread t2 = new Thread(() -> {
- synchronized (lock){
- while (!flag){
- System.out.println(Thread.currentThread().getName()+"...wating...");
- try {
- lock.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- System.out.println(Thread.currentThread().getName()+"...flag is true");
- }
- });
-
- Thread t3 = new Thread(() -> {
- synchronized (lock) {
- System.out.println(Thread.currentThread().getName() + " hold lock");
- lock.notifyAll();
- flag = true;
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- t1.start();
- t2.start();
- t3.start();
-
- }
-
- }
难易程度:☆☆☆
出现频率:☆☆☆
参考回答:
共同点
不同点
代码示例:
- public class WaitSleepCase {
-
- static final Object LOCK = new Object();
-
- public static void main(String[] args) throws InterruptedException {
- sleeping();
- }
-
- private static void illegalWait() throws InterruptedException {
- LOCK.wait();
- }
-
- private static void waiting() throws InterruptedException {
- Thread t1 = new Thread(() -> {
- synchronized (LOCK) {
- try {
- get("t").debug("waiting...");
- LOCK.wait(5000L);
- } catch (InterruptedException e) {
- get("t").debug("interrupted...");
- e.printStackTrace();
- }
- }
- }, "t1");
- t1.start();
-
- Thread.sleep(100);
- synchronized (LOCK) {
- main.debug("other...");
- }
-
- }
-
- private static void sleeping() throws InterruptedException {
- Thread t1 = new Thread(() -> {
- synchronized (LOCK) {
- try {
- get("t").debug("sleeping...");
- Thread.sleep(5000L);
- } catch (InterruptedException e) {
- get("t").debug("interrupted...");
- e.printStackTrace();
- }
- }
- }, "t1");
- t1.start();
-
- Thread.sleep(100);
- synchronized (LOCK) {
- main.debug("other...");
- }
- }
- }
难易程度:☆☆
出现频率:☆☆
参考回答:
有三种方式可以停止线程
代码参考如下:
① 使用退出标志,使线程正常退出。
- public class MyInterrupt1 extends Thread {
-
- volatile boolean flag = false ; // 线程执行的退出标记
-
- @Override
- public void run() {
- while(!flag) {
- System.out.println("MyThread...run...");
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
-
- // 创建MyThread对象
- MyInterrupt1 t1 = new MyInterrupt1() ;
- t1.start();
-
- // 主线程休眠6秒
- Thread.sleep(6000);
-
- // 更改标记为true
- t1.flag = true ;
-
- }
- }
② 使用stop方法强行终止
- public class MyInterrupt2 extends Thread {
-
- volatile boolean flag = false ; // 线程执行的退出标记
-
- @Override
- public void run() {
- while(!flag) {
- System.out.println("MyThread...run...");
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
-
- public static void main(String[] args) throws InterruptedException {
-
- // 创建MyThread对象
- MyInterrupt2 t1 = new MyInterrupt2() ;
- t1.start();
-
- // 主线程休眠2秒
- Thread.sleep(6000);
-
- // 调用stop方法
- t1.stop();
-
- }
- }
③ 使用interrupt方法中断线程。
- package com.itheima.basic;
-
- public class MyInterrupt3 {
-
- public static void main(String[] args) throws InterruptedException {
-
- //1.打断阻塞的线程
- /*Thread t1 = new Thread(()->{
- System.out.println("t1 正在运行...");
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }, "t1");
- t1.start();
- Thread.sleep(500);
- t1.interrupt();
- System.out.println(t1.isInterrupted());*/
-
-
- //2.打断正常的线程
- Thread t2 = new Thread(()->{
- while(true) {
- Thread current = Thread.currentThread();
- boolean interrupted = current.isInterrupted();
- if(interrupted) {
- System.out.println("打断状态:"+interrupted);
- break;
- }
- }
- }, "t2");
- t2.start();
- Thread.sleep(500);
- // t2.interrupt();
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。