Java:多线程
创建线程的方式有两种:
第一种:使用线程类Thread或者继承它的子类创建线程对象
第二种:定义接口类实现接口Runnable创建线程对象
多线程的好处:可以整合资源,提高系统资源的利用率
多线程中提供了同步方法、同步代码块以及加锁的方式实现多线程的同步
实现多线程:
classThread中有两个最重要的函数run()和start()。
1) run()函数必须进行覆写,把要在多个线程中并行处理的代码放到这个函数中。
2) 虽然run()函数实现了多个线程的并行处理,但我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。在调用start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数。
一、简单的多线程举例如下:
需求:设计一个模拟用户从银行取款的应用程序。设某银行账户存款额的初值为2000元,用线程模拟两个用户分别从银行取款的情况。两个用户分4次分别从银行的同一账户取款,每次取100元。
//方式一:继承Thread,并在同步方法中实现多线程同步
class Bank //定义银行类
{
private static int Money=2000;
public static synchronized void getmoney(int x) //同步方法
{
Money = Money - x;
try{Thread.sleep(10);}
catch(InterruptedException e){};
System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+" 元");
}
}
class Custom extends Thread //定义线程类继承Thread
{
public void run()
{
for(int i=0;i<4;i++)
{
Bank.getmoney(100);
}
}
}
class CustomBank
{
public static void main(String[] args)
{
Custom c1 = new Custom(); //创建两个线程c1、c2
Custom c2 = new Custom();
c1.start();
c2.start();
}
}
//方式二:继承Thread,并在同步代码块中实现多线程同步
class Bank //定义银行类
{
private static int Money=2000;
public static void getmoney(int x)
{
synchronized(Bank.class) //同步代码块
{
Money = Money - x;
try{Thread.sleep(10);}
catch(InterruptedException e){};
System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+"元");
}
}
}
class Custom extends Thread //定义线程类继承Thread
{
public void run()
{
for(int i=0;i<4;i++)
{
Bank.getmoney(100);
}
}
}
class CustomBank1
{
public static void main(String[] args)
{
Custom c1 = new Custom(); //创建两个线程c1、c2
Custom c2 = new Custom();
c1.start();
c2.start();
}
}
//方式三:实现Runnable接口,在同步方法或同步代码块中实现多线程同步
class Bank //定义银行类
{
private int Money=2000;
public synchronized void getmoney(int x) //同步方法
{
{
Money=Money-x;
try{Thread.sleep(10);}catch(Exception e){};
System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+" 元");
}
}
} class Custom implements Runnable //定义接口类实现接口Runnable
{
private Bank b = new Bank();
public void run()
{
for(int i=0;i<4;i++)
{
b.getmoney(100);
}
}
}
class CustomBank2
{
public static void main(String[] args)
{
Custom c = new Custom();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
二、线程的技巧性写法:利用匿名内部类创建互不相关的多个线程
class Demo3
{
public static void main(String[] args)
{
//第一个线程
new Thread()
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"...."+i);
}
} }.start(); //第二个线程
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"...."+i);
} //第三个线程
Runnable r = new Runnable()
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"...."+i);
}
} };
new Thread(r).start();
}
}
三、基本的线程的其他几种方法:
1、线程对象.setDaemon() 设置守护线程
2、线程对象.join() 等待该线程结束(顺序执行线程)
3、Thread.yield() 暂停当前正在执行的线程,执行其他的线程
4、线程对象.toStirng() 返回线程的名称、优先级、线程组
5、线程对象.setPriority() 设置线程的优先级
6、线程对象.getPriority() 获得线程的优先级
7、线程对象.interrupt() 中断当前线程
8、线程对象.isAlive() 判断线程是否正在运行
举例如下:
class DemoThread extends Thread
{
public void run()
{
for(int i=0;i<20;i++)
{
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
System.out.println(e.toString());
}
System.out.println(Thread.currentThread().getName()+"......"+i);
//Thread.yield();
}
}
}
class Demo2
{
public static void main(String[] args) throws InterruptedException
{
DemoThread t1 = new DemoThread();
DemoThread t2 = new DemoThread(); //t1.setPriority(Thread.MIN_PRIORITY);//t1.setPriority(1);
//t2.setPriority(Thread.MAX_PRIORITY);//t2.setPriority(10); //t1.setDaemon(true);
//t2.setDaemon(true); t1.start();
//t1.join();
//t1.interrupt(); t2.start();
//t2.join();
//t2.interrupt(); System.out.println("t1线程是否正在运行:"+t1.isAlive());
System.out.println("t2线程是否正在运行:"+t2.isAlive()); System.out.println("t1线程的优先级是:"+t1.getPriority());
System.out.println("t2线程的优先级是:"+t2.getPriority()); System.out.println("t1线程的名称、优先级、线程组"+t1.toString());
System.out.println("t2线程的名称、优先级、线程组"+t2.toString()); for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"......"+i);
}
System.out.println("over");
}
}
Java:多线程的更多相关文章
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- “我爱淘”冲刺阶段Scrum站立会议9
完成任务: 完成了webservice的配置与测试. 计划任务: 可以通过webservice将数据库中的内容解析出来,通过查询可以得到想要的内容. 遇到问题: 服务器已经配好,,也已经测试成功,不过 ...
- 阿里云:linux 一键安装web环境
参考地址:http://www.cnblogs.com/ada-zheng/p/3724957.html
- 【Binary Tree Zigzag Level Order Traversal】cpp
题目: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from lef ...
- 01.FastDFS的安装部署
1.FastDFS简介 (1)FastDFS的功能介绍 FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负 ...
- C++中定义比较函数的三种方法
原文地址:http://fusharblog.com/3-ways-to-define-comparison-functions-in-cpp/ C++编程优与Pascal的原因之一是C++中存在ST ...
- 【BZOJ】【2245】【SDOI2011】工作安排
网络流/费用流 裸题吧……直接建模就好了……所谓的“分段函数”就是吓唬你的,其实就是对于每个人分开建几条流量不同.费用不同的弧而已. 对每种产品,连S->i ,(c[i],0):对每个工作人员 ...
- 【bzoj1004】[HNOI2008]Cards
1004: [HNOI2008]Cards Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2928 Solved: 1754[Submit][Sta ...
- c++ 继承和组合的区别
.什么是继承 A继承B,说明A是B的一种,并且B的所有行为对A都有意义 eg:A=WOMAN B=HUMAN A=鸵鸟 B=鸟 (不行),因为鸟会飞,但是鸵鸟不会. .什么是组合 若在逻辑上A是B的“ ...
- IIS Express 及 vs2008下使用IIS Express
介绍 IIS Express 开发 ASP.NET 的应用程序是我的主要工作.当然我会选择最适合的开发环境.客户多属于企业用户,我的开发的选择,多半是 ASP.NET Web Application ...
- JavaScript之isNaN()函数讲解
定义和用法 isNaN() 函数用于检查其参数是否是非数字值. 语法 isNaN(x) 参数 描述 x 必需.要检测的值. 返回值 如果 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返回的 ...