笔记:

/**通过 Runnable接口来实现多线程
* 1. 创建一个实现runnable 接口的类
* 2. 在类中实现接口的run() 抽象方法
* 3. 创建一个runnable 接口实现类的对象
* 4. 将此对象作为形参传递给Thread 类的构造器中 ,创建 Thread 线程
* 5.调用start() 方法,执行 Thread 方法
* ------------------------------
* Runnable接口意义:
* 可以应用于 已经继承与其他类的线程, 毕竟一个类只能继承一个类!
* class className extends FatherClass implements Runnable
*
*/
/**模拟火车站开启三个窗口售票,火车站总票数20张!
* 1.此线程存在安全问题, 打印车票时,会出现重票和错票问题!!
* 2.如何保证线程的安全?
* 方法一:同步代码块,
* synchronized(同步监视器){
* //需要被同步的代码块(即为操作共享 数据的代码)
* }
* (1) 共享数据, 多个线程 共同操作的同一个数据(变量)
* (2) 同步监视器 ,由一个类的对象(任意对象即可!!)来充当;
* 哪个线程获取此监视器,谁就执行大括号里被同步的代码
* 方法二:同步方法
* public synchronized void methods() {}即可!
*/

线程的Runnable接口 代码

class PrintNum implements Runnable{
@Override
public void run() {
for(int i=1;i<=20;i++)
{
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
public class TestRunnable {
public static void main(String[] args) {
PrintNum p=new PrintNum();
Thread t1=new Thread(p);
Thread t2=new Thread(p);
t1.start();//启动线程:执行Thread 对象生成时,构造器形参的对象的run()方法
t2.start();
}
}

线程的同步方法 代码

//将操作共享数据的方法声明为synchronized ,即此方法为同步方法,能保证当其中一个线程执行此方法时,其他线程在外等待直至此
// 线程全部执行完毕 class Window implements Runnable{ //synchronized( 同步方法 ){} 的方式
public static int tickets=30; public void run() {
while(tickets>0){
print_num();
}
}
public synchronized void print_num( ){ //synchronized( 同步方法 ){} 的方式
if(tickets>0){
try {
Thread.currentThread().sleep(10); //休息10ms,相当于售票花费的时间!
tickets--;
System.out.println(Thread.currentThread().getName()+" 为您售票!"+
"剩余票数:"+tickets);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

同步代码块 代码

class Window2 implements Runnable{     //synchronized(同步监视器){} 的方式
int tickets=30; //全局变量了
Object obj=new Object();
public void run() {
while(true){
synchronized(obj) {
if (tickets > 0) {
try {
Thread.currentThread().sleep(10); //休息10ms,相当于售票花费的时间!
} catch (InterruptedException e) {
e.printStackTrace();
}
tickets--;
System.out.println(Thread.currentThread().getName() + " 为您售票!" +
"剩余票数:" + tickets);
} else
break; //记得在这里解除死循环!!
}
}
}
}
public class TestWindows {
public static void main(String[] args) {
Window w=new Window(); Thread w1=new Thread(w);
Thread w2=new Thread(w);
Thread w3=new Thread(w); w1.setName("窗口1");
w2.setName("窗口2");
w3.setName("窗口3");
w1.start();
w2.start();
w3.start();
} }

Java 基础 线程的Runnable接口 /线程的同步方法 /同步代码块的更多相关文章

  1. Java基础之数据类型、内存、修饰符、代码块

    Java 数据类型 基本数据类型 数值:int.short.long 字符:char 布尔:boolean 引用数据类型 class(类) interface(接口) 数组[] 所占字节数(1 byt ...

  2. Java之同步代码块处理实现Runnable的线程安全问题

    /** * 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的方式 * * 1.问题:卖票过程中,出现了重票.错票 -->出现了线程的安全问题 * 2.问题出现的原因:当某 ...

  3. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  4. java中的synchronized同步代码块和同步方法的区别

    下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...

  5. Java的synchronized的同步代码块和同步方法的区别

    synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不 ...

  6. Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解

    Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解 1.Java虚拟机运行时数据区图 2. 堆的默认分配图 3.方法区结构图 4.对象的内存布局图 5.对象头的Ma ...

  7. Java基础8-多线程;同步代码块

    作业解析 利用白富美接口案例,土豪征婚使用匿名内部类对象实现. interface White{ public void white(); } interface Rich{ public void ...

  8. JAVA基础知识系列---进程、线程安全

    1 相关概念 1.1 临界区 保证在某一时刻只有一个线程能访问数据的简便方法,在任意时刻只允许一个线程对资源进行访问.如果有多个线程试图同时访问临界区,那么在有一个线程进入后,其他所有试图访问临界区的 ...

  9. Java基础面试操作题: 线程问题,写一个死锁(原理:只有互相都等待对方放弃资源才会产生死锁)

    package com.swift; public class DeadLock implements Runnable { private boolean flag; DeadLock(boolea ...

随机推荐

  1. 关于一些初学Unity的基本操作和自己的理解

    1.Scene面板操作:  A.按住鼠标右键,拖动鼠标,可以旋转  B.鼠标滚轮前后滑动,前进后退  C.按下鼠标滚轮,拖动鼠标,可以拖动场景  D.在场景中选中物体,按F键或者在Hierarchy面 ...

  2. Andrew Ng机器学习课程16

    Andrew Ng机器学习课程16 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:主要介绍了ICA算法,并利用最大似然估计和随机梯度上升算法进行求解, ...

  3. 原装win8系统电脑崩溃问题解决

    原装win8系统电脑崩溃问题解决 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:之所以撰写本篇关于win8原装系统电脑崩溃的博文,一是要吐槽一下原装w ...

  4. 基于MSP430G2系列实现的步进电机控制

    基于MSP430G2系列实现的步进电机控制 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电路 ...

  5. c#窗体程序绘制简单心形

    分析思路: 两个圆形和一个矩形如图叠加再逆时针旋转45°,就能得到一个极其简陋的心. 我们只需要将圆心放在矩形上边中点和右边中点即可. 代码如下:   private void button1_Cli ...

  6. springboot集成webSocket能启动,但是打包不了war

    1.pom.xml少packing元素 https://www.cnblogs.com/zeussbook/p/10790339.html 2.SpringBoot项目中增加了WebSocket功能无 ...

  7. 分布式缓存 - hash环/一致性hash

    一 引言 当前memcached,redis这类分布式kv缓存已经非常普遍.我们知道memcached的分布式其实是一种"伪分布式",也就是它的服务器节点之间其实是无关联的,之间没 ...

  8. 利用Python进行数据分析_Pandas_层次化索引

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...

  9. 利用Python进行数据分析_Pandas_汇总和计算描述统计

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. In [1]: import numpy as np In [2]: impo ...

  10. 1267: 展开字符串(Java)

    WUSTOJ 1267: 展开字符串 参考 jamesMusk的博客--Java 判断字符是大写小写或者数字 Description   给三个参数a1,a2,a3和一个字符串,请按以下要求展开该字符 ...