文档章节

多线程的学习

wuyiyi
 wuyiyi
发布于 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();
}

© 著作权归作者所有

共有 人打赏支持
wuyiyi
粉丝 1
博文 28
码字总数 10668
作品 0
浦东
程序员
Posix多线程编程学习笔记

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

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

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

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

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

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

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

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

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

Yamazaki
2012/03/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kernel version does not match DSO version

错误信息: kernel version 384.11 does not match DSO version 384.130.0 原因是: cuda driver版本太低,不匹配DSO 简单有效的修复方法,升级nvidia driver, 步骤如下: 1. google seach ...

刘小米
今天
0
0
maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部