Java多线程编程-实现方式-实现runnable 售票 线程同步
原创约 865 字大约 3 分钟...
线程同步.md
241-Java多线程编程-实现方式-_实现runnable & 售票 &注意
本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。
概念

示例代码
package com.tencent.chapter04.两种实现方式;
public class TestRunnable {
public static void main(String[] args) {
/**
* 测试继承Thread
*/
//线程一
//ThreadDemo t1 = new ThreadDemo();
//t1.run();//此时为单线程,仅为调用一个类的普通方法而已
//t1.start();//启动线程,让线程就绪,但是不会立马执行run方法,等待CPU分配时间片
//线程二
//ThreadDemo t2 = new ThreadDemo();
//t2.start();//启动线程,让线程就绪,但是不会立马执行run方法,等待CPU分配时间片
/**
* 测试实现Runnable
*/
RunableDemo runableDemo = new RunableDemo();
//t3.start();//没有start()方法,不能启动一个线程
//线程三
Thread t3 = new Thread(runableDemo);
t3.start();
//线程四
Thread t4 = new Thread(runableDemo);
t4.start();
//主线程
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
}
package com.tencent.chapter04.售票;
/**
* 线程同步:使用synchronized关键字修饰
1.同步方法:使用synchronized修饰方法
//同步方法,粒度粗
public synchronized void run() {
}
类锁:synchronized修饰static的方法,例如:
public static synchronized void run() {},基于当前类,一次只能被一个线程访问
对象锁:synchronized修饰非static的方法,例如:
public synchronized void run() {},基于当前对象,一次只能被一个线程访问
2.同步语句:使用synchronized修饰代码块
//同步语句,粒度细
synchronized (this) {
}
类锁(RunnableTicket.class)、对象锁(this)、任意锁("a","b")
*/
public class RunnableTicket implements Runnable{
private int num = 50;
//同步语句,粒度细
@Override
public void run() {
while(num > 0)
{
// 1 杰成 2 国威---------------排队
synchronized (this) {
//加一层判断,判断当前是否还有余票
if(num > 0)
{
System.out.println("售票员 【" + Thread.currentThread().getName() + "】,售出了票NO." + num);
num--;
}
}
//Thread休眠一秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//同步方法,粒度粗
//@Override
public synchronized void run1() {
while(num > 0)
{
System.out.println("售票员 【" + Thread.currentThread().getName() + "】,售出了票NO." + num);
num--;
}
}
}
package com.tencent.chapter04.售票;
public class ThreadTicket extends Thread{
private int num = 50;
@Override
public void run() {
while(num > 0)
{
System.out.println("售票员 【" + Thread.currentThread().getName() + "】,售出了票NO." + num);
num--;
}
}
}
package com.tencent.chapter04.售票;
public class TicketTest {
public static void main(String[] args) {
/**
* 继承Thread:不能实现数据共享,因为每new一次对象,生成一个新的num保存在堆内存中,且只能单继承
*/
/*//售票员一号
ThreadTicket t1 = new ThreadTicket();
t1.setName("杨国");
t1.start();
//售票员二号
ThreadTicket t2 = new ThreadTicket();
t2.setName("陆嘉琛");
t2.start();*/
/**
* 实现Runnable接口:可以共享数据,RunnableTicket仅new一次,num在内存中仅存在一份,共享给t3与t4一起使用,支持多实现
*/
RunnableTicket ticket = new RunnableTicket();
//售票员三号
Thread t3 = new Thread(ticket);
t3.setName("杰成");
t3.start();
//售票员四号
Thread t4 = new Thread(ticket);
t4.setName("国威");
t4.start();
RunnableTicket ticket2 = new RunnableTicket();
//售票员三号
Thread t5 = new Thread(ticket2);
t5.setName("杰成2");
t5.start();
//售票员四号
Thread t6 = new Thread(ticket2);
t6.setName("国威2");
t6.start();
}
}
分割线
相关信息
以上就是我关于 Java多线程编程-实现方式-_实现runnable & 售票 & 线程同步 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。
Powered by Waline v2.15.4