评论区留下邮箱可获得《Java多线程设计模式详解》

转载请指明来源

1)后台线程

后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程。后台线程总是等到非后台线程死亡之后,后台线程没有了服务对象,不久就会自动死亡,不再复活。利用setDaemon方法可以把一个线程设置为后台线程,但必须在线程启动之前调用。

例如 :

/*
* @author wxismeit@163.com
*/
public class DaemonThread extends Thread {
public void run() {
for(int i=0; i<100; i++) {
System.out.println(getName() + " " + i);
}
} public static void main(String[] args) throws InterruptedException {
DaemonThread dt = new DaemonThread();
dt.setDaemon(true);//必须在启动线程之前调用
dt.start();
System.out.println(dt.isDaemon());//true
for(int i=0; i<10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
Thread.sleep(1000);//让当前线程睡眠1s,进入阻塞状态。其他线程可以执行
}
//在主线程main结束不久,后台线程st也会死亡 } }

2)线程让步 :yield

让当前线程暂停,但不阻塞该线程。让该线程转入就绪状态。系统根据优先级重新调度线程。可以使用setPriority方法设置线程的优先级。

例如:

public class YieldThread extends Thread {
public YieldThread(String name) {
super(name);
}
public void run() {
for(int i=0; i<50; i++) {
System.out.println(getName() + " " + i);
if(i == 20) {
Thread.yield();//让当前线程让步
}
}
} public static void main(String[] args) {
YieldThread yt1 = new YieldThread("high");
YieldThread yt2 = new YieldThread("low");
yt1.setPriority(MAX_PRIORITY);//优先级设为高级
yt1.start();
yt2.setPriority(MIN_PRIORITY);//优先级设为低级
yt2.start();
} }

3)sleep  和 yield的区别

sleep暂停时,进入阻塞状态,其他线程会执行,不考虑优先级。而yield暂停时进入就绪状态。只会给优先级相同或更高的线程执行机会。

4)线程同步

在银行取钱时 如果两个线程同时操作一个账户,就会出现不应该的错误,这就是线程不安全的。那么如何能让线程成为安全的呢。

public class Account {
private String accountNo;
private double balance;
public Account() {};
public Account(String a,double b) {
accountNo = a;
balance = b;
}
public void setaccountNo(String accountNo) {
this.accountNo = accountNo;
}
public void setbalance(double balance) {
this.balance = balance;
}
public String getaccountNo() {
return this.accountNo;
}
public double getbalance() {
return this.balance;
}
//重写hashcode方法
public int hashCode() {
return accountNo.hashCode();
}
//重写equals方法
public boolean equals(Object obj) {
if(this == obj) return true;
if(obj != null && obj.getClass() == Account.class) {
Account a = (Account)obj;
return a.getaccountNo().equals(accountNo);
}
return false;
} }
public class Withdraw extends Thread{
private Account account;
private double drawNo;
public Withdraw(String name, Account a, double d) {
super(name);
account = a;
drawNo = d;
} public void run() {
//synchronized(account) {//锁定对象,其他线程无法获得,无法修改账户。
if(account.getbalance() >= drawNo) {
System.out.println("所取钱数为 :" + drawNo);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.setbalance(account.getbalance() - drawNo);
System.out.println("余额为: " + account.getbalance());
}else {
System.out.println("取钱失败!");
//}
}
} }
public class DrawMoney {

	public static void main(String[] args) {
Account ac = new Account("wangxu", 1000);
new Withdraw("甲", ac, 800).start();
new Withdraw("乙", ac, 800).start();
}
}

如上代码所示,在修改能够引发线程不安全问题的时候,就要锁定。这时可以用代码同步块和同步方法来锁定,所用关键字为synchronized。具体不再赘述。

4)同步锁

为了更灵活的解决线程安全问题,Java引入了同步锁。有读写锁,可重入锁等。

举个简单的例子:

import java.util.concurrent.locks.ReentrantLock;

public class lock {
private final ReentrantLock lock = new ReentrantLock();
//需要线程安全的方法
public void f() {
lock.lock();//加锁
try{
//...
}finally {
lock.unlock();//释放锁
}
} }

关于死锁和线程通信下次更新。

评论区留下邮箱可获得《Java多线程设计模式详解》

转载请指明来源

Java多线程详解(二)的更多相关文章

  1. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  2. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  3. Java多线程详解

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  4. Java 多线程详解(一)------概念的引入

    这是讲解 Java 多线程的第一章,我们在进入讲解之前,需要对以下几个概念有所了解. 1.并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在 ...

  5. 原创Java多线程详解(一)

    只看书不实践是不行的.来实践一下~~~~~~(引用请指明来源) 先看看百科对多线程的介绍 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的 ...

  6. Java 多线程详解(二)------如何创建进程和线程

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html 在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和 ...

  7. java多线程详解(7)-线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, 这样频繁创建线程就会大大降低系 ...

  8. java多线程详解(1)-多线程入门

    一.多线程的概念 线程概念 线程就是程序中单独顺序的流控制. 线程本身不能运行,它只能用于程序中. 说明:线程是程序内的顺序控制流,只能使用分配给程序的资源和环境. 进程:操作系统中执行的程序 程序是 ...

  9. java 多线程详解

    一.重点 重点: 1.创建和启动线程 2.实现线程调度 3.实现线程同步 4.实现线程通信 1.为什么要学习多线程? 当多个人访问电脑上同一资源的时候,要用到多线程,让每个人感觉很多电脑同时为多个人服 ...

随机推荐

  1. Python高级编程之生成器(Generator)与coroutine(四):一个简单的多任务系统

    啊,终于要把这一个系列写完整了,好高兴啊 在前面的三篇文章中介绍了Python的Python的Generator和coroutine(协程)相关的编程技术,接下来这篇文章会用Python的corout ...

  2. iOS边练边学--(Quartz2D)基本图形的绘制#附加自定义进度控件的练习

    一.Quartz2D使用须知 Quartz2D的API是纯C语言的 Quartz2D的API来自于Core Graphics框架 二.<1>通过原始的方法(C语言)绘制简单图形--了解 & ...

  3. Application.idle方法

    Application.Idle()方法表示:当应用程序处于空闲状态时执行相应代码. 示例程序 1.界面设计:一个简单的Lable控件 2.代码 using System; using System. ...

  4. 试验如何通过审核Google AdSense——我跟谷歌ads杠上啦

    http://www.hankcs.com/appos/webhost/apply-google-ads.html —————————————————————————————————————————— ...

  5. mysql 修改用户权限,允许远程连接数据库

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'admin123' WITH GRANT OPTION; flush privileg ...

  6. YARN : Architecture of Next Generation Apache Hadoop MapReduceFramework

    转自:http://blog.csdn.net/colorant/article/details/9146201 == 目标问题 == 下一代的Hadoop框架,支持10,000+节点规模的Hadoo ...

  7. Deep Reinforcement Learning from Self-Play in Imperfect-Information Games

    Heinrich, Johannes, and David Silver. "Deep reinforcement learning from self-play in imperfect- ...

  8. com.sun.awt.AWTUtilities.setWindowOpacity相关说明

    在eclipse中(jdk1.6.*)版本中出现编译不通过而报错,报错是因为这个包里面的方法不属于jdk正式版本,也就是不能保证下个版本还存在,所以编译器会拒绝,你可以在eclipse中如下设置: 选 ...

  9. C# 使用SkinSharp皮肤库

    SkinSharp是Windows环境下一款强大的通用换肤库. SkinSharp作为通用换肤库,只需要在您的程序中添加一行代码,就能让您的界面焕然一新,并拥有多种主题风格和色调的动态切换功能以及Ae ...

  10. Bash 脚本 getopts为什么最后一个參数取不到

    看以下的Bash脚本: #!/bin/bash interval=0 count=0 pid="" while getopts "p:d:n" arg do c ...