现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?

目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。

核心:

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。

比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

想要更深入了解,建议看一下join的源码,也很简单的,使用wait方法实现的。

t.join(); //调用join方法,等待线程t执行完毕

t.join(1000); //等待 t 线程,等待时间是1000毫秒。

public static voidmain(String[] args) {

method01();

method02();

}/*** 第一种实现方式,顺序写死在线程代码的内部了,有时候不方便*/

private static voidmethod01() {

Thread t1= new Thread(newRunnable() {

@Overridepublic voidrun() {

System.out.println("t1 is finished");

}

});

Thread t2= new Thread(newRunnable() {

@Overridepublic voidrun() {try{

t1.join();

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("t2 is finished");

}

});

Thread t3= new Thread(newRunnable() {

@Overridepublic voidrun() {try{

t2.join();

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("t3 is finished");

}

});

t3.start();

t2.start();

t1.start();

}/*** 第二种实现方式,线程执行顺序可以在方法中调换*/

private static voidmethod02(){

Runnable runnable= newRunnable() {

@Overridepublic voidrun() {

System.out.println(Thread.currentThread().getName()+ "执行完成");

}

};

Thread t1= new Thread(runnable, "t1");

Thread t2= new Thread(runnable, "t2");

Thread t3= new Thread(runnable, "t3");try{

t1.start();

t1.join();

t2.start();

t2.join();

t3.start();

t3.join();

}catch(InterruptedException e) {

e.printStackTrace();

}

}

在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?

Lock读写锁机制可以实现!

在Java中Lock接口比synchronized块的优势是什么?

Lock接口最大的优势是为读和写分别提供了锁。

importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Random;importjava.util.concurrent.locks.ReadWriteLock;importjava.util.concurrent.locks.ReentrantReadWriteLock;public classJoinTest2 {public static voidmain(String[] args) {final TheData theData = newTheData();for(int i=0;i<4;i++){new Thread(newRunnable() {

@Overridepublic voidrun() {

theData.get();

}

}).start();

}for(int i=0;i<4;i++){new Thread(newRunnable() {

@Overridepublic voidrun() {

theData.put(new Random().nextInt(1000));

}

}).start();

}

}

}classTheData{private Integer data = 0;private ReadWriteLock rwLock = newReentrantReadWriteLock();

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");public voidget(){

rwLock.readLock().lock();//读锁开启,读进程均可进入

try{//用try finally来防止因异常而造成的死锁

System.out.println(Thread.currentThread().getName()+"read lock is ready.."+sdf.format(newDate()));

Thread.sleep(1000);

System.out.println(Thread.currentThread().getName()+"read data is"+data);

}catch(InterruptedException e) {

e.printStackTrace();

}finally{

rwLock.readLock().unlock();//读锁解锁

}

}public voidput(Integer data){

rwLock.writeLock().lock();//写锁开启,这时只有一个写线程进入

try{//用try finally来防止因异常而造成的死锁

System.out.println(Thread.currentThread().getName()+"write lock is ready.."+sdf.format(newDate()));

Thread.sleep(1000);this.data =data;

System.out.println(Thread.currentThread().getName()+"write data is"+data);

}catch(InterruptedException e) {

e.printStackTrace();

}finally{

rwLock.writeLock().unlock();//写锁解锁

}

}

}

在java中wait和sleep方法的不同?

通常会在电话面试中经常被问到的Java线程面试问题。

最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。

此处我想理一下Java多线程的基础知识:

- Java的多线程锁是挂在对象上的,并不是在方法上的。即每个对象都有一个锁,当遇到类似synchronized的同步需要时,就会监视(monitor)每个想使用本对象的线程按照一定的规则来访问,规则也就是在同一时间内只能有一个线程能访问此对象。

- Java中获取锁的单位是线程。当线程A获取了对象B的锁,也就是对象B的持有标记上写的是线程A的唯一标识,在需要同步的情况下的话,只有线程A能访问对象B。

- Thread常用方法有:start/stop/yield/sleep/interrupt/join等,他们是线程级别的方法,所以并不会太关心锁的具体逻辑。

- Object的线程有关方法是:wait/wait(事件参数)/notify/notifyAll,他们是对象的方法,所以使用的时候就有点憋屈了,必须当前线程获取了本对象的锁才能使用,否则会报异常。但他们能更细粒度的控制锁,可以释放锁。

java多线程常用面试_Java多线程常用面试题(含答案,精心总结整理)相关推荐

  1. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...

    面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...

  2. 北大青鸟Java内侧答案_北大青鸟推荐:Java精选笔试题(含答案解析)

    北大青鸟推荐:Java精选笔试题(含答案解析)如果你是计算机专业出生,但是还没有找到工作的话,你就得补补技术了,一些关于面试.笔试的题要多刷一刷.有可能你知道答案,但是由于语言组织能力有所欠缺,所以面 ...

  3. SQL面试必会50题(含答案和学习链接)

    最近在刷 sql 题,刷完了网上的 SQL 面试必会 50 题,现把我的答案和思路整理如下,供大家参考. 这是目录 一.创建四张表 二.SQL面试必会50题(不含答案) 三.SQL面试必会50题(含答 ...

  4. java多线程常用面试_java的多线程常见面试题

    并行和并发有什么区别? (推荐学习:java常见面试题) 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 并行是在不同实体上的多个事件,并发是在同一实体上的多个事 ...

  5. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  6. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  7. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  8. java 中常用英语_java中常用英语

    英语|JAVA笔试题常见英语_电子/电路_工程科技_专业资料.Java 笔试题常见英语 What will be the output when you compile and execute the ...

  9. 【Java架构师面试题】设计模式面试专题(共35题含答案)

    设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性的解决方案. 本篇为设计 ...

  10. ie 访问 java接口_2019年面试总结,100道Java程序员面试题(含答案)分享

    2019年即将结束,一边是大批同学涌入职场,另一边是大群职场人打算跳槽,在这个重要的节点,Java程序员如何才能把握时机,搞定面试官,拿到一份心仪的工作呢? 除了掌握扎实的专业技能之外,你还需要一份& ...

最新文章

  1. netBeans开发j2ME入门一些资源
  2. 直接广播地址_计算机网络之网桥、冲突域、广播域是什么?
  3. 洛谷 P1410 子序列(DP)
  4. python opencv imread(filename, flags=None) 读取图像 flags cv::ImreadModes 参数上哪看去?
  5. Linux centos查看cpu信息命令
  6. .NET 状态机Automatonymous快速入门
  7. 二分查找和二叉查找树
  8. 报错 插入更新_window如何解决mysql数据量过大导致的报错
  9. concurrenthashmap_ConcurrentHashMap核心原理,这次彻底给整明白了
  10. 数百台浪潮服务器支撑中石油油品加工生产系统
  11. 专升本C语言知识点笔记
  12. gridview 排序
  13. Java微信小微商户进件,已经解决接口暂无权限,稍后再试的问题
  14. SEO搜索引擎优化是什么
  15. CURLOPT_NOSIGNAL
  16. ps制作图标时的尺寸
  17. EPICS--areaDetector--ADEiger
  18. 计算机应用提高篇课后答案,计算机应用技能技巧
  19. 5寸android智能手机,5寸刚入门 六款巨屏安卓智能手机盘点(5)
  20. python 游戏按键精灵 PyDirectInput介绍

热门文章

  1. iOS蓝牙4.0基础开发
  2. 从0开始构建一个属于你自己的PHP框架
  3. 我的Android第五章:通过Intent实现活动与活动之间的交互
  4. VSTO/Excel: 获取Excel图表中的某个点的数据
  5. React开发中常见问题和 Warning
  6. tomcat设置子域名session共享以及修改JSESSIONID
  7. 挖一挖那些让公司网站瘫痪的SQL“终结者”
  8. 「开源资讯」Apache Storm 2.2.0 发布,分布式实时计算
  9. JS对数据进行判空操作
  10. vscode生成vue模板快捷键_VSCode 初次写vue项目并一键生成.vue模版