1.线程和进程的区别
进程是正在运行的程序实例,每个进程包含了多个线程,每个现场执行不同的任务
进程都有自己的内存空间,而一个进程下的线程们则是共享内存空间
线程更加轻量,线程上下文切换的成本远低于进程上下文切换的成本
2.并行与并发的区别
并行是多核CPU一般执行相应个数的线程
并发是线程轮流使用一个或多个CPU,在单CPU的状态下,微观上讲其实他是串行的
3.创建线程都有哪些方式
extends Thread
public class MyThread extends Thread{ ...... } MyThread thread=new MyThread();
implement Runnable
pubic class MyRunnable implement Runnable{ ....... } MyRunnable runnable=new MyRunnable(); Thread thread=new Thread(runnable);
implement Callable<T>
public class MyCallable implement Callable<T>{ public T call(){ .... return T; } } MyCallable callable=new MyCallable(); FutureTask<T> task=new FutureTask(callable); Thread t=new Thread(task); ... t.start(); ... //调用task的get方法可以获取执行结果 T res=task.get()
线程池创建线程
public class MyExecutors implements Runable{ ....... } // 创建线程池对象 ExecutorService executorPool=Executors.newFiexedThreadPool(3); threadPool.submit(new MyExecutors()); // 关闭线程池 threadPool.shutdown
4.实现runnable和实现callable有什么区别?
- callable是有返回值的,可以用Future、FutureTask拿到执行的结果
- run()是不允许抛异常的,但是call()是可以抛的
5.线程执行的run()和start()方法有什么区别
run方法是直接执行了被封装的代码,是可以执行多次的
start方法是启动线程,该方法只能调用一次,多次会抛出异常。不过start方法也是调用run方法内的逻辑
6.线程包含了哪些状态
新建->运行->( 阻塞 等待 时间等待 )->终止
new一个线程之后是新建状态
调用start()方法后线程进入运行状态;在方法体内sync抢不到锁进入阻塞状态,获得锁后返回运行状态;有sleep()就是进入时间等待状态,;有wait()方法就是进入等待状态,notify()方法唤醒后进入运行状态
线程抢到了CPU执行权,start结束后就是终止状态
7.如何保证线程按顺序执行
线程具有join()方法,具体为等待某线程结束后,该线程才可以执行
Thread t1 = new Thread(() -> { System.out.println("t1 is run...."); }); Thread t2 = new Thread(() -> { try { t1.join();//直到t1运行结束之后t2才会运行 System.out.println("t2 is run...."); } catch (InterruptedException e) { throw new RuntimeException(e); } }); t2.start(); t1.start();
8.什么是notify和notifyAll
notify是随机唤醒一个wait线程;notifyAll是唤醒所有wait线程
9.说说wait和sleep的不同
wait(),wait(long)和sleep(long)都能让当前线程暂时放弃cpu的使用权,进入阻塞状态;
sleep是静态方法,可以直接用,wait方法是Object成员的方法,每个对象都有
wait()和wait(long)都可以被notify唤醒;sleep(long)、wait(long)都会在等待相应时间后被唤醒;都可以被打断唤醒
wait必须要配合锁来使用(比如sync锁)sleep无限制;wait执行后会释放CPU使用权,给其他线程使用sleep如果在sync锁内,即使sleep了CPU使用权也未释放
10.如何停止一个正在运行的线程
使用flag,让线程正常退出(在线程外指定位置终止while(xxx)条件)
使用interupt方法中断线程,打断sleep,wait,join的线程会抛异常;打断正常线程和第一种情况一样
标签:java,速通,Thread,start,线程,new,多线程,sleep,wait From: https://www.cnblogs.com/kun1790051360/p/18455295