文档章节

多线程的学习

lara-
 lara-
发布于 2017/04/05 22:33
字数 739
阅读 7
收藏 0

1.线程的状态:

1)新建状态:当用new操作符创建一个线程时,例如new Thread(),线程还没有开始运行,此时线程正处在新建状态。当一个线程处于新生状态时,程序还没有运行线程中的代码

2)就绪状态(runnable):一个新建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争cpu,只有获得cpu时间才可以运行线程。因为在单cpu的计算机系统中,不能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此可能有多个线程处于就绪状态。对于处于就绪状态的线程是由java运行时系统的线程调度程序来调度的。

3)运行状态(running)

当线程获得cpu时间后,它才进入运行状态,真正开始执行run()方法。

4)阻塞状态(blocked) 

线程进入阻塞状态有:

a、线程通过调用sleep方法进入睡眠状态

b、线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者

c、线程试图获取一个锁,而该锁被其他线程调用

d、线程在等待某个出发条件

5)死亡状态(dead)

a、run方法正常退出而自然死亡

b、一个未捕获的异常终止了run方法而使线程猝死

判断线程是否存活(可运行、被阻塞)可使用isAlive。

2.死锁产生的原因及必要条件

原因:1)系统资源不足;2)进程运行推进的顺序不合适;3)资源分配不当

必要条件:1)互斥条件:一个资源只能被一个线程使用

                 2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源不释放

                 3)不剥夺条件:进程已获得的资源,在未使用完之前,不会被释放

                  4)循环等待条件:若干进程形成一种头尾相接的循环等待资源关系。

3.使用synchronized,wait,notify。生产者、消费者问题

public synchronized void produce() {
    if (this.product >= MAX_PRODUCT) {
        try {
            wait();
            System.out.println("产品已满,请稍后");
            return;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    product++;
    System.out.println("生产者生产第" + this.product + "个产品.");
    notifyAll();
}

public synchronized void consume(){
    if (this.product <= MIN_PRODUCT ){
        try {
            wait();
            System.out.println("产品已消耗完,请稍后");
            return;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    product--;
    System.out.println("消费者取走了第" + this.product + "个产品.");
    notifyAll();
}

© 著作权归作者所有

lara-
粉丝 2
博文 69
码字总数 30761
作品 0
浦东
高级程序员
私信 提问
Posix多线程编程学习笔记

Posix多线程编程学习笔记(一)—线程基础(1) http://blog.chinaunix.net/u/22935/showart_310711.html Posix多线程编程学习笔记(一)—线程基础(2) http://blog.chinaunix.net/u/2293...

晨曦之光
2012/04/13
240
0
C#多线程学习(二) 如何操纵一个线程

[1] C#多线程学习(二) 如何操纵一个线程 [2]C#多线程学习(二) 如何操纵一个线程 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生...

Yamazaki
2012/03/29
12
0
C#多线程学习(三) 生产者和消费者

[1] C#多线程学习(三) 生产者和消费者 [2]C#多线程学习(三) 生产者和消费者 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者...

Yamazaki
2012/03/29
19
0
C#多线程学习(五) 多线程的自动管理(定时器)

本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线...

Yamazaki
2012/03/29
23
0
C#多线程学习(六) 互斥对象

本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线...

Yamazaki
2012/03/29
8
0

没有更多内容

加载失败,请刷新页面

加载更多

对比ubuntu与centos系统 ​​​​

CentOS与Ubuntu该如何选择,哪个更好用。笔者在自媒体平台收集了一些网友的观点,较为经典,分享给大家。至于应该选择哪个,希望看完本文章后,读者心中有数。 观点1:CentOS适用于服务器,U...

老孟的Linux私房菜
今天
13
0
Java的基本类型

一、Java的基本类型 Java的基本类型有哪些? boolean char byte short int long float double ? 延伸思考 思考一:为什么有的书籍说Java存在第9种数据类型? 实际上,JAVA中还存在另外一种基...

yumoop
今天
14
0
OSChina 周四乱弹 —— 富婆小时候

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @猿敲月下码 :#今日歌曲推荐# 分享陈慧娴的单曲《夜机》 《夜机》- 陈慧娴 手机党少年们想听歌,请使劲儿戳(这里) @開源中國張學友 :早上...

小小编辑
今天
24
0
MyMinimad ── Linux下用libmad写的mp3解码播放程序(四)

优化了内存使用,不再使用mmap映射整个文件到内存 /* * 本程序是从 minimad 改进而来,如要更详细的说明请参看 minimad.c * * Gu Zhou, 2009/12/25, SiChuan University, China *...

代码强国
今天
18
0
Minikube安装

1、下载Minikube二进制文件 sudo curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/latest/minikube-linux-amd64 2、设置权限 sudo chmod +x minikube......

RogueQ
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部