Java多线程-实例解析
Java多线程实例 3种实现方法
Java中的多线程有三种实现方式:
1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。
2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法。
3.实现Callable接口,重写call方法。Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。有以下三点
1).Callable可以在人物结束后提供一个返回值,Runnable没有提供这个功能。
2).Callable中的call方法可以抛出异常,而Runnable的run方法不能抛出异常。
3).运行Callable可以拿到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。
需要注意的是,无论用那种方式实现了多线程,调用start方法并不意味着立即执行多线程代码,而是使得线程变为可运行状态。
run start的区别
start方法是启动一个线程,而线程中的run方法来完成实际的操作。
如果开发人员直接调用run方法,那么就会将这个方法当作一个普通函数来调用,并没有多开辟线程,开发人员如果希望多线程异步执行,则需要调用start方法。
sleep wait的区别
1.两者处理的机制不同,sleep方法主要是,让线程暂停执行一段时间,时间一到自动恢复,并不会释放所占用的锁,当调用wait方法以后,他会释放所占用的对象锁,等待其他线程调用notify方法才会再次醒来。
2.sleep是Threa的静态方法,是用来控制线程自身流程的,而wait是object的方法,用于进行线程通信。
3.两者使用的区域不同。sleep可以在任何地方使用,wait必须放在同步控制方法,或者语句块中执行。
synchronized notify wait的运用
synchronized关键字有两种用法,synchronized方法和synchronized语句块。
public synchronized void function(){}
synchronized(object){}
当某个资源被synchronized所修饰,线程1线程2等多个线程在共同请求这个资源,线程1先请求到,调用了对象的wait方法释放了对象的锁,此时线程2可以对这个对象进行访问,在工作结束时可以调用对象的notify方法,唤醒等待队列中正在等待的线程,此时被唤醒的线程将会再一次拿到对象锁,对对象进行操作。可以调用notifyAll方法,唤醒等待队列中的所有线程。
需要注意的是一个线程被唤醒不代表立即获取对象锁,必须等调用的线程对象的方法推出synchronized块释放对象锁后,被唤醒的进程才会获得对象锁。
以下为大家提供一个简单的代码实例:
分别用Runnable和Thread方法实现,展示各个方法的
实现Runnable实现多线程的方法
public class TestRunnable implements Runnable { private int time=1;
private SourceA s;
private String id = "001";
public TestRunnable(SourceA s){
this.s = s;
}
public void setTime(int time) {
this.time = time;
} @Override
public void run() {
try {
System.out.println("i will sleep"+ time);
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} synchronized(s){
s.notify();
System.out.println("我唤醒了002!");
System.out.println("我存入了id"+id);
s.setSource(id);
}
} }
继承Thread实现多线程的方法
public class TestThread extends Thread {
private int time = 1;
private SourceA s = null;
String id = "002"; public void setTime(int time) {
this.time = time;
} public TestThread(SourceA s){
this.s = s ;
} @Override
public void run() {
try {
System.out.println("i will sleep"+ time);
sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} synchronized(s){
try {
System.out.println("我"+ id +"要进行等待了");
s.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("我被唤醒了");
System.out.println("我存入了id"+id);
s.setSource(id);
}
} }
SourceA类代码:
public class SourceA {
private List<String> list = new ArrayList<String>();
public synchronized void getSource(){
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
public synchronized void setSource(String id){
list.add(id);
}
}
Test测试类代码:
public void test(){
SourceA s = new SourceA();
TestThread tt = new TestThread(s);
TestRunnable tr = new TestRunnable(s);
Thread t = new Thread(tr);
System.out.println("调用线程1");
tt.start();
System.out.println("调用线程2");
t.start();
}
结果图片:
Java多线程-实例解析的更多相关文章
- java多线程知识点汇总(二)多线程实例解析
本实验主要考察多线程对单例模式的操作,和多线程对同一资源的读取,两个知识.实验涉及到三个类: 1)一个pojo类Student,包括set/get方法. 2)一个线程类,设置student的成员变量a ...
- 最全面的Java多线程用法解析
1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable ...
- 【JAVA多线程安全问题解析】
一.问题的提出 以买票系统为例: class Ticket implements Runnable { public int sum=10; public void run() { while(tru ...
- java多线程实例
import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.concurr ...
- Java继承实例解析
Java继承 前言 继承是面向对象语法的三大特征之一.继承可以降低代码编写的冗余度,提高编程的效率.通过继承,子类获得了父类的成员变量和方法.一个子类如何继承父类的字段和方法,如何修改从父类继承过来的 ...
- Linux多线程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
- java多线程实例(2)
public class ThreadDemo05 { public static void main(String args[]) { // 四个售票点应该控制同一个资源 Demo d = new ...
- java多线程实例程序实现与思想
写程序之前要了解两个概念 1.什么是进程 2.什么是线程 搞清楚这两个概念之后 才能写好一个合适而不会太抽象的程序 对进程和线程的理解见链接: https://blog.csdn.net/new_te ...
- 【转】 Java 多线程之一
转自 Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...
随机推荐
- More Divisors(反素数)
More Divisors Time Limit: 2 Seconds Memory Limit: 65536 KB Everybody knows that we use decimal ...
- 使用Git上传代码到GitHub详细的不能再详细教程
据说不会用GitHub的程序员连菜鸟都不算,确实,GitHub上有大量优秀的代码,我们也可以将自己的代码分享上去. 首先,你要有一个GitHub的账号,https://github.com/在官网注册 ...
- SQL Server 自学笔记
--★★★SQL语句本身区分大小写吗 --SQLServer 不区分大小写 --Oracle 默认是区分大小写的 --datetime的输入格式,2008-01-07输入进去后显示为1905-06-2 ...
- Chapter 1.简单工厂模式
该篇文章通过一个写计算器控制台程序,来导入文章主题. 首先,要注意代码规范,变量命名有意义,不能随意用A,B,C; 功能要封装好,不要写在一个主函数里,另外要考虑后期需求的更改,如果出现多个函数 ...
- 不老的新丁 Python何以让人着迷
Python是一门美丽的语言.它简单易学,跨平台,而且运转良好.达成了许多Java一直求索的技术目标.一言以蔽之就是:其他的语言是与时代同 步,而Python则是未雨绸缪,而且计划得颇为出色.当然,这 ...
- 用Chart控件绘制动态图表
进行程序设计时,选用一个合适的ActiveX控件,有时可大大减少编程工作量.ActiveX 控件(又称OCX)基于COM技术,作为独立的软件模块,它可以在任何程序设计语言中插入使用.本文仅以VC++为 ...
- Debian 7 下载
Debian 7 DOWNLOAD http://cdimage.deb ...
- Linux看门狗脚本 1.4
近期项目的看门狗经历了三个版本号. 第一个版本号: 用ps -ef,假设程序挂了就启动 第二个版本号: 程序因为执行时会出现不再监听7901port,所以不能简单推断机器是不是挂了,而是推断此port ...
- 往Amazon上upload bundle经常中断的处理方法
首先可以按如下脚本进行重复提交 #!/bin/bash ;i<=;i=i+)) do ret1=`bin/ec2-upload-bundle -b myrawbucket -m /ec2-ami ...
- 如何判断是否安装了VC RUNTIME
先得说下GUID,它是Globally Unique Identifier的简称,中文翻译为“全球唯一标示符”,在Windows系统中也称之为Class ID,缩写为CLSID.对于不同的应用程序,文 ...