如果还有重要资料需要加入,请查看的各位帮忙备注
1. 创建线程有几种方式,分别是?
2. 怎么获取当前线程?3. 阐述下线程的生命周期?
4. 线程运行状态之间的协调方式?
5. 如何将线程设置为后台线程,后台线程跟前台线程的结束关系?
6. 设定线程优先级的方法是?
7. 当有多个线程使用同一个资源时,解决线程同步的方法又哪些?
8. 怎么建立线程之间的管道通信?
9. 如何实现线程分组管理?
10. 线程的异常处理流程?
11. JKD为提供了几种线程池,分别是?
12. 阐述一下ThreadLocal类的作用?
答案1:
方式一:
直接继承Thread类并重写其public void run()方法
class 线程类名 extends Thread{
@Override
public void run() {
super.run();
}
}
方式二:
创建类实现Runnable接口
class 线程类名 implements Runnable{
@Override
public void run() {
//线程执行体
}
}
new Thread(Runnable对象,线程名字).start()
方式三:
线程功能最为强大,就是使用复杂一点
1.实现Callable接口
class 线程执行体<返回值类型> implements Callable<返回值类型>{
@Override
public 返回值类型 call() throws Exception {
return null;
}
}
2.使用Future封装
new FutureTask<返回值类型>(Callable对象)
答案2:
直接使用Thread的静态方法-->Thread.currentThread()
答案3:
建立线程--启动线程进入就绪状态(Runnable)--线程进入运行状态(Running)--线程运行结束死亡状态(Dead)--线程进入阻塞状态(Block)
答案4:
1. 运行线程会因为这些原因进入阻塞状态:调用sleep()方法,遇到使用的资源被占用,调用了一个阻塞方法(通常是阻塞式IO方法),调用了suspend()方法,等待某个通知notify()
2. 运行线程会因为这些原因进入就绪状态:调用yield()方法
3. 线程插队:运行线程创建了一个线程x,并使用了线程x.join()方法,运行线程需要等线程x运行完后才能继续执行.
答案5:
直接使用线程.setDaemon(true)方法将前台线程变为后台线程(必须在启动之前设定),当所有的前台线程死亡,后台线程会自动死亡;前台线程创建的线程默认为前台线程,后台线程创建的线程默认为后台线程
答案6:
直接使用线程.setPriority(Thread.NORM_PRIORITY|MIN_PRIORITY|MAX_PRIORITY)方法(必须在启动之前设定)
答案7:
方式一:
在线程中使用同步代码块锁定对象资源,确定代码块执行完成后或调用了资源对象的wait()方法才会释放对象资源:
synchronized (对象资源) {
线程执行代码
}
方式二:
在对象资源中定义同步方法,当某个线程使用到该对象资源的方法时就会锁定对象资源,直到方法使用完成后或调用了资源对象的wait()方法才会释放对象资源:
synchronized + 方法名(){
方法代码
}
方式三:
Lock lock = new ReentrantLock();
lock.lock();
try {
{
锁定资源对象的代码区域
}
}
finally{
lock.unlock();
}
协调方式,同wait()
Condition condition = lock.newCondition();
condition.await();
condition.signal();
condition.signalAll();
答案8:
都是阻塞式的:PipedInputStream和PipedOutputStream同下
PipedWriter pw = new PipedWriter();
PipedReader pr = new PipedReader();
pw.connect(pr);
答案9:
补充线程可以直接加到后台线程中成为后台线程,在后台线程组的所有线程结束后,线程组会自动销毁
创建线程组(new ThreadGroup())-->在创建线程的时候指定线程组(new Thread(线程组,Runnable对象,线程名字))
答案10:
线程异常处理的优先顺序,异常处理后线程结束;
如果线程本身使用了setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler),优先使用自身设定的异常处理方式-->Thread.setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)-->线程组的异常处理方式uncaughtException(t, e)-->抛出异常线程结束
答案11:
线程池会根据系统需要创建线程数量;
ExecutorService executorServiceCache = Executors.newCachedThreadPool();
创建固定线程数量的线程池
ExecutorService executorServiceFixed = Executors.newFixedThreadPool(5);
线程池可以在指定时间后执行线程
ScheduledExecutorService executorServiceScheduled = Executors.newScheduledThreadPool(5);
线程池使用完后要记得shutdown()
答案12:
当有多个线程访问同一个对象资源,线程可以给包含ThreadLocal的资源对象起一个别名