java 学习笔记4
(1) 线程的强制运行
先看线程强制运行的实例 ,再解释程序中是如何让程序强制运行的
public class ThreadTest1 implementsRunnable {
publicvoid run()
{
int i = 0;
for (int x = 0; x < 10; x++)
{
System.out.println(Thread.currentThread().getName()+"--->>"+i++);
}
}
}
public class threadjoin {
publicstatic void main(String[] args) {
ThreadTest1 t= new ThreadTest1();
Thread pp = new Thread(t);
pp.start();
int i=0;
for(int x =0;x<10;x++)
{
if(i == 5)
{
try
{
pp.join();
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
System.out.println("main Thread"+ i++ );
}
}
}
在程序启动了两个线程,一个是main()线程,一个是 pp 线程。
程序第 15 行,调用 pp 线程对象的 join()方法,在程序的输出结果中可以发现,调
用 join()方法之后,只有 pp 的线程对象在运行,也就是说,join()方法用来强制某
一线程运行。
由此例可知:由上可见,pp 线程中的代码被并入到了 main 线程中,也就是 pp 线程中的代码不
执行完,main 线程中的代码就只能一直等待。查看 JDK 文档可以发现,除了有无参
数的 join 方法外,还有两个带参数的 join 方法,分别是 join(long millis)和 join(long
millis,int nanos),它们的作用是指定合并时间,前者精确到毫秒,后者精确到纳秒,
意思是两个线程合并指定的时间后,又开始分离,回到合并前的状态。
(2) 多线程的同步
同步代码块定义语法
synchronized(对象)
{
需要同步的代码 ;
}
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
注意要点:
1) 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
2) 当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
3) 当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
4) 当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
线程同步代码实例:
public class withdra {
private int totalMoney = 0;
public synchronized void getmoney(int money){
synchronized(this)
{
System.out.println("正在执行getmoney()方法!");
int restmoney = totalMoney;
restmoney -= money;
try{
Thread.sleep(1000);
}catch (InterruptedException e)
{
e.printStackTrace();
}
totalMoney =restmoney;
System.out.println(Thread.currentThread().getName()+"提取1000元后的余额为:"+totalMoney);
}
}
public void setMoney()
{
this.totalMoney=9999;
System.out.println(Thread.currentThread().getName()+"把存款设置为:"+totalMoney);
}
publicwithdra(int totalmoney) {
this.totalMoney =totalmoney;
}
}
public class FirThread implements Runnable{
privatewithdra wd;
publicvoid run() {
wd.getmoney(1000);
}
publicFirThread(withdra wd)
{ this.wd = wd ;}
}
public class secThread implements Runnable{
privatewithdra wd;
publicvoid run() {
wd.setMoney();
}
publicsecThread(withdra wd)
{ this.wd = wd ;}
}
public class TestSyn {
publicstatic void main(String[] args) {
withdrawd = new withdra(4000);
System.out.println("现在的存款为4000");
FirThreadft = new FirThread(wd);
secThreadst = new secThread(wd);
Threadth1 = new Thread(ft,"th1");
Threadth2 = new Thread(ft,"th2");
th1.start();
try{
Thread.sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
th2.start();
}
}
java 学习笔记4的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
随机推荐
- checkbox在jquery版本1.9 以上用attr不可重复操作的问题【附解决方案】
最近做个项目,需要重复多次更改checkbox的状态,使用jquery 1.10.2的最新版本时发现,对checkbox的选中状态无法多次选中.测试代码如下: <!DOCTYPE html PU ...
- 微软CSS面试全记录
先是会有一轮简单的电话技术面试,聊的比较随意,什么都会问,跟职位相关的都有.然后会发一些材料说是要学习,是windows内存管理相关的东西. 完了就是一轮oral test,和技术没有任何关系,问问为 ...
- 2D image convolution
在学习cnn的过程中,对convolution的概念真的很是模糊,本来在学习图像处理的过程中,已对convolution有所了解,它与correlation是有不同的,因为convolution = ...
- 我是如何实用:before :after
本文地址http://www.cnblogs.com/Bond/p/3972854.html 最近一直做移动端,没和IE6打交道了,瞬间感觉世界变美好了.移动端虽然还是各种坑,但是比起修复IE6那还是 ...
- keybd_event函数用法
转自不用winio,直接达到驱动级模拟键盘效果的keybd_event函数用法 键盘模拟技术是在编写游戏外挂时经常使用的技术.但是由于很多游戏采用了directinput的方式,使得发送的一般键盘消息 ...
- 为什么 API 监控对于任何业务来说都重要?
对于商务运算来说一个比较稳定的趋势在于对 API 日渐增长的依赖性,几乎每一个代码级交互过程都会调用 API 来收集数据或触发某些关键过程.没有 API ,你将无法与同伴进行文件交流,没有 API , ...
- linux使用ps1设置命令行提示符
要自定义命令行提示,需要ps1来设置.完成自定义需要以下几个步骤: 1.编辑~/.bashrc文件 vi ~/.bashrc 2.在.bashrc文件中添加以下一行自定义内容 export PS1=& ...
- QString的不常见用法
QString str("Hello"); QString str = "Hello"; static const QChar data[4] = { 0x00 ...
- vs2015 Xamarin.Android安装
原文:vs2015 Xamarin.Android安装 Xamarin.Android 安装步骤,以vs2015为例 1,安装vs2015中的跨平台项,但是安装在国内肯定失败,因为需要到谷歌下载 当我 ...
- C/C++ ceil和floor函数
ceil 是“天花板" floor 是 “地板” 一个靠上取值,另一个靠下取值,如同天花板,地板. double ceil ( double x ); float ceil ( float ...