(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的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  3. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  4. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  5. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  6. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  7. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  10. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

随机推荐

  1. 非常实用的JQuery的选项卡切换源码

    <html> <head> <meta charset="utf-8"> <title>简单选项卡</title> &l ...

  2. php练习6——面向对象编程(打印乘法表)

    要求:编写一个成员函数,从键盘输入一个数(0—9),打印出对应的乘法表 程序:viewChengFB.html chengFB.class.php printChengFB.php   结果  

  3. Django生产环境的部署-Apache-mod_wsgi

    httpd.conf配置 ServerSignature On ServerTokens Full Define APACHE24 Apache2.4 Define SERVER_BASE_DIR & ...

  4. wpf+xml实现的一个随机生成早晚餐的小demo

    话说每到吃完的时间就发愁,真的不知道该吃什么,然后就想到做一个生成吃什么的小软件,既然这个软件如此的简单,就打算用wpf开发吧,也不用数据库了,直接保存在xml中就可以了 程序整体结构如下图 首先我写 ...

  5. TCP/IP入门学习(2)---OSI分层

    一.会话层以上的处理 1.表示层 将数据从主机特有的格式转换为网络标准传输格式.以此使得不同环境之间的通信成为可能. 2.会话层 即决定使用哪个连接或者哪种连接方式将数据发送出去.会话层也会在数首部添 ...

  6. OSI/RM网络7层体系

    转自OSI/RM网络7层体系 1 物理层 这是整个OSI参考模型的最低层,它的任务就是提供网络的物理连接.所以,物理层是建立在物理介质上(而不是逻辑上的协议和会话),它提供的是机械和电气接口.主要包括 ...

  7. 使用 Cloud Insight SDK 监控北京空气质量!

    现在越来越多的 App 都开始有广告了.特别是空气质量监测,和天气类的 App,广告还是蛮多的,眼花缭乱,真是够了. 最近刚好在用一款系统监控工具 Cloud Insight,它提供的 SDK 可以把 ...

  8. WINDOWS下,中文JSON格式读取报错处理:ValueError: No JSON object could be decoded

    File "C:\Python27\lib\json\__init__.py", line 290, in load **kw) File "C:\Python27\li ...

  9. 【SGU 390】Tickets (数位DP)

    Tickets   Description Conductor is quite a boring profession, as all you have to do is just to sell ...

  10. user模式下编译android 代码被proguard优化导致类和变量丢失

    在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...