Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
清新范er
JavaGuide
提交
55f19c3a
J
JavaGuide
项目概览
清新范er
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
4
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
55f19c3a
编写于
11月 08, 2018
作者:
S
Snailclimb
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
https://github.com/Snailclimb/Java_Guide
上级
732633d0
f411dc38
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
5 addition
and
5 deletion
+5
-5
面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md
面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md
+5
-5
未找到文件。
面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md
浏览文件 @
55f19c3a
...
...
@@ -20,7 +20,7 @@
2.
**可运行(runnable)**
:线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。
3.
**运行(running)**
:可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。
4.
**阻塞(block)**
:阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种:
-
**(一). 等待阻塞**
:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(wait
t
ing queue)中。
-
**(一). 等待阻塞**
:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waiting queue)中。
-
**(二). 同步阻塞**
:运行(running)的线程在获取对象的同步锁时,若该同步 锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
-
**(三). 其他阻塞**
: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5.
**死亡(dead)**
:线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
...
...
@@ -82,10 +82,10 @@ public class Run {
![
结果
](
https://user-gold-cdn.xitu.io/2018/3/20/16243e80f22a2d54?w=161&h=54&f=jpeg&s=7380
)
从上面的运行结果可以看出:线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。
###②实现Runnable接口
###
②实现Runnable接口
推荐实现Runnable接口方式开发多线程,因为Java单继承但是可以实现多个接口。
<
MyRunnable.java
MyRunnable.java
```
java
public
class
MyRunnable
implements
Runnable
{
...
...
@@ -164,7 +164,7 @@ Thread类中包含的成员变量代表了线程的某些优先级。如**Thread
**如何设置守护线程?**
可以通过调用 Thead 类的
`setDaemon(true)`
方法设置当前的线程为守护线程
>
。
可以通过调用 Thead 类的
`setDaemon(true)`
方法设置当前的线程为守护线程。
注意事项:
...
...
@@ -178,7 +178,7 @@ Thread类中包含的成员变量代表了线程的某些优先级。如**Thread
-
两者最主要的区别在于:
**sleep方法没有释放锁,而wait方法释放了锁**
。
-
两者都可以暂停线程的执行。
-
Wait通常被用于线程间交互/通信,sleep通常被用于暂停执行。
-
wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者no
fifyA
l()方法。sleep()方法执行完成后,线程会自动苏醒。
-
wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者no
tifyAl
l()方法。sleep()方法执行完成后,线程会自动苏醒。
## 9 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录