当前位置: 首页 > 编程日记 > 正文

【面试 多线程】【第九篇】多线程的问题

1.多线程有什么用

发挥多核CPU优势,防止阻塞,更快的处理数据

===============================================================

2.多线程的实现方式有哪几种,分别的特点优势是什么样的

1》继承Thread类,重写run方法,start启动多线程

2》实现Runnable接口,重写run方法,交给new Thread(),start启动多线程

3》使用Callable和Future创建多线程,Lamade表达式创建Callable对象,FutureTask包装Callable对象,该对象封装了call()方法的返回值,使用Futuretask作为Thread对象的target创建并启动线程,调用FutureTask对象的get方法获取子线程的返回值

对比优势

1》继承Thread类的话,只能单继承

2》实现Runnable接口的话,可以多实现,还能继承别的类

3》实现Callable接口的话,call方法执行子线程有返回值,而实现Runnable接口的话,run方法执行完了没有返回值

===============================================================

3.run()方法和start()方法的区别

run方法是多线程的实现方法体,不会执行多线程,只是同步执行

start方法才是真正启动多线程

===============================================================

4.join()方法的特点是什么?

join方法就是使得线程的并行执行变成串行执行

public static void main(String [] args) throws InterruptedException {ThreadJoinTest t1 = new ThreadJoinTest("小明");ThreadJoinTest t2 = new ThreadJoinTest("小东");t1.start();/**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代码的意思就是:程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会*/t1.join();t2.start();}

===============================================================

5.Runnable接口和Callable接口的区别是什么?

1》Runnable接口的run方法没有返回值,只是单纯的区执行run方法中的代码

2》Callable接口中的call方法是有返回值的,可以通过FutureTask中的get方法获取到异步执行的结果。

===============================================================

6.volatile关键字的特征

1》volatile关键字修饰的变量是共享变量,对所有线程是可见的

1.1》当写一个volatile变量时,JVM会把该线程对应的本地内存中的变量强制刷新到住内存中

1.2》这个写操作会导致其他线程中对这个变量的缓存无效

2》volatile对于n++这种复合性操作,需要通过循环CAS的方式保证其原子性

===============================================================

7.一个线程如果出现运行时异常,会怎么样

一个线程如果出现运行时异常,会被停止执行。

===============================================================

8.怎么实现多线程之间的数据共享

1》如果多线程执行相同操作,可以仅实现一个Runnable接口,接口中的变量就是共享数据

package 多线程共享数据;public class Ticket implements Runnable{private int ticket = 10;public void run() {while(ticket>0){ticket--;System.out.println("当前票数为:"+ticket);}}}================================
package 多线程共享数据;public class SellTicket {/*** @param args*/public static void main(String[] args) {Ticket t = new Ticket();new Thread(t).start();new Thread(t).start();}}
View Code

2》如果多线程执行不同的操作,可以将共享变量以及操作方法封装成一个类,将这个类作为多个线程实现类的属性进行操作,也可以实现数据共享

public class MyData {private int j=0;public  synchronized void add(){j++;System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j);}public  synchronized void dec(){j--;System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j);}public int getData(){return j;}
}
======================================
public class AddRunnable implements Runnable{MyData data;public AddRunnable(MyData data){this.data= data;}public void run() {data.add();}}
====================================
public class DecRunnable implements Runnable {MyData data;public DecRunnable(MyData data){this.data = data;}public void run() {data.dec();}}
============================测试代码:
public class TestOne {/*** @param args*/public static void main(String[] args) {MyData data = new MyData();Runnable add = new AddRunnable(data);Runnable dec = new DecRunnable(data);for(int i=0;i<2;i++){new Thread(add).start();new Thread(dec).start();}}
View Code

3》或者使用多线程实现类做内部类,内部类共享外部类属性的思想

public class MyData {private int j=0;public  synchronized void add(){j++;System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j);}public  synchronized void dec(){j--;System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j);}public int getData(){return j;}
}
===============================
public class TestThread {/*** @param args*/public static void main(String[] args) {final MyData data = new MyData();for(int i=0;i<2;i++){new Thread(new Runnable(){public void run() {data.add();}}).start();new Thread(new Runnable(){public void run() {data.dec();}}).start();}}}
View Code

===============================================================

9.sleep和wait的区别

1》sleep()方法是 Thread类的方法,暂停执行,不会释放同步锁,可以在任何地方执行

2》wait()方法死Object类的方法,释放同步锁资源,直到notify去唤醒,才有资格再去竞争同步锁资源,只能在同步代码块中执行

3》yield()方法只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

===============================================================

10.谈谈你对锁的理解

对于多线程中的方法,加上synchronized就有了锁的概念。

进入synchronized代码块之前,自动获取到锁。正常退出或者抛异常都会释放锁。

synchronized关键字:

 1、synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象; 3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法; Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized关键字的作用进行深入了解才可定论。总的说来,synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。在进一步阐述之前,我们需要明确几点:A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。B.每个对象只有一个锁(lock)与之相关联。C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

===============================================================

11.如何解决死锁的问题

让多线程有序的访问共享资源,或者用线程安全的Map记录哪个资源被哪个线程使用。可以解决死锁的问题。

===============================================================

12.如何有序的访问共享资源

1.将共享资源的访问访问操作方法,用synchronized关键字修饰,即同步代码块,这样可以保证同时只有一个线程可以访问。

2.或者可以用volatile变量记录,奇数的时候线程1访问,偶数的时候线程2反问。

===============================================================

相关文章:

那个大战AlphaGo的柯洁,将免试入读清华大学工商管理专业

日前&#xff0c;柯洁将免试入读清华大学的消息经媒体曝光了出来。《2019 年优秀运动员免试入学推荐名单》3 月 10 日开始公示&#xff0c;围棋世界冠军柯洁的名字出现在名单上&#xff0c;其中表明他将就读清华大学工商管理类专业。据了解&#xff0c;柯洁预计今年下半年入学清…

【Qt】设置背景

1、使用样式表qss设置背景 QDialog 设置背景图片: dlg->setStyleSheet("QDialog{border-image: url(://test.png);}"); 设置背景颜色: dlg->setStyleSheet("QDialog{background-color: red;}"); QWidget 设置背景图片: wgt->setStyleSheet…

基于Hadoop的MapReduce框架研究报告

http://www.doc88.com/p-19830708273.html

【Qt】设置窗口透明度

1、使用setWindowOpacity设置透明度 setWindowOpacity(0.5); 设置完成会使窗体、标题栏、子控件都透明 2、使用样式表qss设置窗体透明 dlg->setStyleSheet("QDialog{background-color: rgba(255, 0, 0, 0.5);}");wgt->setStyleSheet("QWidget{backgrou…

7行Python代码,搭建可以识花的机器学习App|视频教程

你想学Python&#xff0c;却不知如何着手&#xff0c;那你需要一种更加有趣的学习方式。Siraj Raval是一位人工智能领域的编程高手&#xff0c;毕业于哥伦比亚大学&#xff0c;曾任职于 Twilio 和 Meetup&#xff0c;他通过制作教程类短视频的方式在Youtube上积累了大量的粉丝&…

java中缀表达式转后缀表达式(逆波兰算法)

四则运算是栈的重要应用之一 中缀表达式转后缀表达式&#xff08;逆波兰算法&#xff09;过程 从左到右遍历中缀表达式数字直接输出为后缀表达式一部分如果是符号&#xff0c;则判断与栈顶元素的优先级高于栈顶元素优先级直接入栈低于或等于栈顶优先级栈顶元素出栈并输出为后缀…

Wpf消息循环之消息传递

几天遇见一个问题需要检查某个wpf程序是否已经运行&#xff0c;如果没有运行则启动传递参数&#xff0c;如果已运行则需要直接传递消息。在没有运行 情况下传递参数很简单&#xff0c;我们只需要Process cmd窗口启动并传递参数&#xff0c;在程序中处理。但是如果程序已经启动有…

【Qt】使用sqlite3数据库时,主键自增和获取自增后的主键的

创建数据表格&#xff0c;设置主键自增 创建数据库时&#xff0c;启用主键自增加特性 Create table testTable (id INTEGER PRIMARY KEY AUTOINCREMENT,。。。。 注意事项&#xff1a;设置主键自增时&#xff08;AUTOINCREMENT&#xff09;&#xff0c;主键类型必须是INTEGER&…

拿下斯坦福和剑桥双offer,00后的算法学习之路

董文馨&#xff0c;00后&#xff0c;精通英语&#xff0c;西班牙语。斯坦福大学计算机系和剑桥大学双Offer&#xff0c;秋季将进入斯坦福大学学习。10岁开始在国外上学&#xff1b;12岁学Scratch&#xff1b;13岁学HTML & CSS&#xff1b;14岁开始学Python & Java&…

Mybatis【配置文件】就是这么简单

配置文件和映射文件还有挺多的属性我还没有讲的&#xff0c;现在就把它们一一补全 映射文件 在mapper.xml文件中配置很多的sql语句&#xff0c;执行每个sql语句时&#xff0c;封装为MappedStatement对象&#xff0c;mapper.xml以statement为单位管理sql语句 Statement的实际位置…

cto denalil

Denali使用准虚拟化技术来提高x86电脑上虚拟机的性能。Denali的虚拟机为因特网服务专门支持了最小化的操作系统。 系统可以运行上千虚拟机。Xen与Denali不同&#xff0c;因为它试图运行适当数量的完整操作系统&#xff0c;而非大量轻量级操作系统。转载于:https://blog.51cto.c…

Redis学习笔记 - 数据类型与API(1)Key

Redis学习笔记 - 数据类型与API&#xff08;1&#xff09;Key Key相关命令 1. 常用命令 命令含义时间复杂度keys查找所有符合给定模式 pattern 的 keyO(N)&#xff0c; N 为数据库中 key 的数量dbsize计算key的总数O(1)exists检查key是否存在O(1)del删除指定的key-valueO(1)exp…

【Qt】enum和QString的相互

使用Q_ENUM注册enum Q_ENUM使用元对象系统meta-object来注册,因此在enum所在的类中必须包含宏Q_OBJECT或者Q_GADGET。 例子如下 class MyClass : public QObject{Q_OBJECTpublic:MyClass(QObject *parent = 0);~MyClass();enum Priority { High, Low, VeryHigh, VeryLow };Q_…

Gmail全球大规模宕机

整理 | 非主流出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;今天&#xff08;3 月 13 日&#xff09;&#xff0c;Google 的多项服务在全球范围内出现了不同程度的宕机&#xff0c;包括 Gmail、Google Drive、 Hangouts、谷歌地图等。受影响最大的是拥有超 10 亿用…

搭建域控服务器

作业环境 服务器端(VirtualBox VM) 操作系统&#xff1a;Windows Server 2003 Enterprise Edition SP2 IPAddress&#xff1a;192.168.1.1/255.255.255.0 Gateway&#xff1a;null 客户端(VirtualBox VM) 操作系统&#xff1a;Windows XP SP3 IPAddress&#xff1a;192.168.1.2…

【Git】ubuntu安装git

sudo apt-get install git 图形界面的&#xff1a;sudo apt-get install git-gui 查看ssh服务是否启动 sudo ps -e | grep ssh 如果没有启动执行如下命令&#xff1b; sudo service ssh start 如果没有ssh&#xff0c;使用如下命令安装 sudo apt-get install ssh

Composer 篇

学习网站Composer 中文网 资源包 Packagist Packagist / Composer 中国全量镜像如何安装 Composer下载 Composer安装前请务必确保已经正确安装了PHP。打开命令行窗口并执行php -v查看是否正确输出版本号。打开命令行并依次执行下列命令安装最新版本的 Composer&#xff1a;php …

西工大开源拥挤人群数据集生成工具,大幅提升算法精度 | CVPR 2019

作者 | 周强&#xff08;CV君&#xff09;转载自 我爱计算机视觉&#xff08;公众号id&#xff1a;aicvml&#xff09;近年来&#xff0c;因为拥挤人群计数在视频监控、公共安全方面的应用广泛&#xff0c;引起了不少学者的关注。简单说来这个任务就是给定图像&#xff0c;返回…

getElementById 不能取得visible=false 的控件解决方法

想要绑定textbox的回车事件到一个按钮上&#xff0c;但不想显示这个按钮&#xff0c;如果你把这个button的visible设置为false,那么你使用 getElementById是获取不到的&#xff0c;或者说取到的为空。这是因为Visiblefalse&#xff0c;在编译后&#xff0c;该控件在页面上不显示…

【Git】在本地创建git库管理自己的代码

1、创建本地库 git init . 新建库 git config --global user.email “hello163.com” git config --global user.name “laoer” git config --global core.editor vim //将默认编辑器由nano更改为vim 2、提交 2.1 git add . 将当前目录下所有文件添加到提交缓冲区 2.2 git …

“智慧血联网平台”亮相军民融合技术装备博览会

该平台可实现血液全程跟踪溯源&#xff0c;为大众提供安全、透明、便捷的用血服务。 一个打造智慧化血液管理新模式的血联网平台最近亮相第三届中国军民融合技术装备博览会。该平台可实现血液全程跟踪溯源&#xff0c;为大众提供安全、透明、便捷的用血服务。 此次博览会以“聚…

AI专利之争:小米超华为,国家电网才是大Boss?

作者 | 一一编辑 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;以往相关机构发布 AI 专利数量排行榜时&#xff0c;如果表明“中国在 AI 专利申请数量上已经超过美国&#xff0c;中国在 AI 技术实力上已在国际上遥遥领先”&#xff0c;这类榜单会招致对中国科…

SLF4J 的几种实际应用模式--之二:SLF4J+Logback

前面讲的 SLF4J 的用法之一是 SLF4JLog4J&#xff0c;而这里要推出的组合是 SLF4JLogBack。不用 Log4J&#xff1f;难道还有比 Log4J 更好的日志实现吗&#xff1f;是的&#xff0c;答案就是 LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手&#xff0c;你就不会觉得…

10行Python,搭建一个游戏AI | 视频教程

昨天为大家推荐了三个Python视频&#xff0c;包含&#xff1a;《利用Python&#xff0c;用4分钟时间搭建一个情感分析系统》、《7行Python代码&#xff0c;搭建一个可以识花的机器学习APP》、《10行Python&#xff0c;搭建一个可以自动作曲的神经网络》&#xff0c;今天营长再为…

ABAP git客户端

Jerry习惯把自己写的小程序放到自己的github上&#xff1a;https://github.com/i042416 对于写的ABAP程序&#xff0c;需要先把SAPGUI里的代码手动拷贝到本地&#xff0c;然后用git客户端push到github上。 但是其实可以直接在SAPGUI里通过一个ABAP实现的git客户端将代码push到g…

【Git】git 与远程库交互

一、远程操作 1、克隆 git clone <url> 2、提交 git add &#xff1a;添加 git commit -m “修改信息” &#xff1a;提交到本地 git branch -a &#xff1a;查看所有分支&#xff0c;红色的是远程分支 git fetch &#xff1a;获取远程分支 git diff HEAD FETCH_HEAD…

[轉]在jQuery1.5中使用deferred对象 - 拿着放大镜看Promise

http://www.cnblogs.com/sanshi/archive/2011/03/11/1981789.html 不錯的JS方面的文章 三生石上

拼多多成立技术顾问委员会,陆奇将领导相关工作

整理 | 琥珀出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;美国东部时间 3 月 13 日上午&#xff0c;拼多多&#xff08;NASDAQ&#xff1a;PDD&#xff09;公布了截止 2018 年 12 月 31 日的第四季度和全年年的未经审计财务业绩。拼多多创始人、C…

【linux】Valgrind工具集详解(一):简介

一、Valgrind概述 Valgrind是用于构建动态分析工具的仪器框架。它附带了一组工具&#xff0c;每个工具都执行某种调试&#xff0c;分析或类似任务&#xff0c;可帮助您改进程序。Valgrind的架构采用模块化设计&#xff0c;因此可以轻松创建新工具&#xff0c;而不会干扰现有结…

An internal error occurred during: Launching xxx on WebLogic10.x.

An internal error occurred during: "Launching xxx on WebLogic10.x". java.lang.NullPointerException 蕃薯耀 2018年3月15日 http://www.cnblogs.com/fanshuyao/ 一、问题描述&#xff1a; Myeclipse 将项目部署web服务器报错&#xff1a; An internal error oc…