博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程面试
阅读量:7065 次
发布时间:2019-06-28

本文共 1959 字,大约阅读时间需要 6 分钟。

调试意味着就是要main线程挂起来

线程一定要调用start启动,run是被java虚拟机调度的

start显示被调用的好处就是一个对象可以作为线程来运行

 Runable可以当做一个在属性上共享方式而存在的线程,无需Thread方式共享

http://jingyan.baidu.com/article/e6c8503c2a32e2e54f1a1831.html

后面不是很好理解

 

 

4.java线程常用方法

 

 

,分别是新建,可运行,运行中,睡眠,阻塞,等待,死亡。【也可以五个,便于识记】

 

2.setPriority(int newPriority)方法

设置线程的优先级:线程默认的优先级是创建它的执行线程的优先级。

线程优先级为1~10之间的正整数,JVM从不会改变一个线程的优先级。然而,1~10之间的值是没有保证的。一些JVM可能不能识别10个不同的值,而将这些优先级进行每两个或多个合并,变成少于10个的优先级,则两个或多个优先级的线程可能被映射为一个优先级。

 

线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:

static int MAX_PRIORITY

          线程可以具有的最高优先级。 
static int MIN_PRIORITY
          线程可以具有的最低优先级。 
static int NORM_PRIORITY
          分配给线程的默认优先级。 

 

3Thread.yield()方法,放弃的意思

Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。 

4join()方法

Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。

 

1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。

sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

【如果是调用Thread.sleep(10);】【实例也是可以调用静态方法的,静态则不能使用实例】

2、最主要sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

 

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

 

wait和notify【wait相对于notify是释放锁,让出CPU】

wait()和notify()一系列的方法,是属于对象的,不是属于线程的。在synchronized语句块中,同一个对象,一个线程在执行完这一块代码之前,同一个对象是不能同时被两个线程用来进入synchronized中的。这就是线程同步。

 

wait()意思是说,我等会儿再用这把锁,CPU也让给你们,我先休息一会儿!

notify()意思是说,我用完了,你们谁用?

 

wait()会让出对象锁,同时,当前线程休眠,等待被唤醒,如果不被唤醒,就一直等在那儿。

notify()在多个锁的情况下,b.notify只是唤醒拥有B对象锁的线程,a锁被释放

 【重解释下join和yield】

在t2实现体中,t1.join则是让t2进入堵塞状态,而yield相反,自己让出给t2运行

 

 

概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。 

转载于:https://www.cnblogs.com/chenxuezhouLearnProgram/p/5697029.html

你可能感兴趣的文章
JAVA常见的面试题
查看>>
《Python高效开发实战》实战演练——建立应用2
查看>>
导出容器快照,并导入为镜像
查看>>
撰写合格的REST API
查看>>
infoq 七牛云CTO
查看>>
java: -source 1.6 中不支持 switch 中存在字符串.....
查看>>
4.8_获取页面元素的内容_getTable
查看>>
JavaScript的性能优化:加载和执行
查看>>
Block Formatting Contexts(块级格式化上下文)
查看>>
自己封装的BaseDao--更加灵活方便--hashmap
查看>>
struts2 中的 addActionError 、addFieldError、addAction
查看>>
es6 module模块
查看>>
<mvn:default-servlet-handler/>标签作用
查看>>
Java初始化顺序
查看>>
我的友情链接
查看>>
JS操作DOM的几个属性与方法
查看>>
我的友情链接
查看>>
磁盘空间满额报警shell脚本
查看>>
Flex中使用HTTPService与服务器端交换数据
查看>>
perl anyevent
查看>>