实现多线程的方式:

实现多线程的方式有多种,这里只列举两种常用的,而第一种继承Thread的方式无法实现多窗口卖票。
一,继承Thread方式:
特点:多线程多实例,无法实现资源的共享。
例子:
package com.demo.study.multithreading;
public class MyThread extends Thread{
private int i = 10;
// 可以自行定义锁,也可以使用实例的锁
Object mutex = new Object();
public void selltickets(){
synchronized (mutex) {
if(i>0){
i--;
//getName()获取线程的名字
System.out.println(Thread.currentThread().getName()+" :"+ i);
}
}
}
@Override
public void run() {
while(i>0){
selltickets();
}
}
}
启动线程:
package com.demo.study.multithreading;
public class Test {
public static void main(String[] args) {
//继承Thread方式:多线程多实例,无法实现资源的共享
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
//给线程命名
myThread1.setName("线程1");
myThread2.setName("线程2");
myThread1.start();
myThread2.start();
}
}
运行结果:
二,实现Runnable方式:
特点:多线程单实例,可实现资源的共享
例子:实现多窗口卖票:
package com.demo.study.multithreading;
public class MyThreadImpl implements Runnable {
private int tickets = 10;
public void sellTickets() {
synchronized (MyThreadImpl.class) {
if (tickets > 0) {
tickets--;
System.out.println(Thread.currentThread().getName() + "正在卖票,还剩下" + tickets + "张");
}
}
}
@Override
public void run() {
while (tickets > 0) {
sellTickets();
try {
// 休眠一秒,让执行的效果更明显
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
启动线程:
注意:Thread中的start()方法是线程的就绪,而线程的启动,需要等待CPU的调度(也就是所谓的线程抢资源);run()方法的方法体代表了线程需要完成的任务,称之为线程执行体。
void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
package com.demo.study.multithreading;
public class Test {
public static void main(String[] args) {
//只创建一个实例
MyThreadImpl threadImpl = new MyThreadImpl();
//将上面创建的唯一实例放入多个线程中,Thread类提供了多个构造方法,见下图(构造方法摘要)
Thread thread1 = new Thread(threadImpl, "窗口1");
Thread thread2 = new Thread(threadImpl, "窗口2");
thread1.start();
thread2.start();
}
}
| 构造方法摘要 | |
|---|---|
Thread() 分配新的 Thread 对象。 |
|
Thread(Runnable target) 分配新的 Thread 对象。 |
|
Thread(Runnable target, String name) 分配新的 Thread 对象。 |
|
Thread(String name) 分配新的 Thread 对象。 |
|
Thread(ThreadGroup group, Runnable target) 分配新的 Thread 对象。 |
|
Thread(ThreadGroup group, Runnable target, String name) 分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。 |
|
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。 |
|
Thread(ThreadGroup group, String name) 分配新的 Thread 对象。 |
|
运行结果:
三、同步锁与资源共享:
CPU可能随机的在多个处于就绪状态中的线程中进行切换,这时就可能出现线程的安全问题;线程安全问题,其实是指多线程环境下对共享资源的访问可能会引起此共享资源的不一致性,而解决安全问题则需要同步锁的加入,执行synchronized部分代码的时候必须需要对象锁,而一个对象只有一个锁,只有执行完synchronized里面的代码后释放锁,其他线程才可以获得锁,那么就保证了同一时刻只有一个线程访问synchronized里面的代码。实现资源共享的关键是,只有一个实例,synchronized使用的是同一把锁,用实例的锁或者定义一个实例。这就需要使用实现Runnable接口的方式,实现多线程,这样传入的是一个实例。继承Thread的方式,传入的是多个实例,每个实例都有一个锁,那就无法实现控制。
以上这篇多线程(多窗口卖票实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# 多线程卖票
# java多线程之火车售票系统模拟实例
# 多线程
# 多个
# 的是
# 只有一个
# 给大家
# 多窗口
# 其名
# 为其
# 便将
# 资源共享
# 都有
# 那就
# 是指
# 两种
# 这就
# 希望能
# 才可以
# 可以使用
# 这篇
# 可能出现
相关文章:
实现虚拟支付需哪些建站技术支撑?
已有域名能否直接搭建网站?
建站之星安装失败:服务器环境不兼容?
建站之星后台密码遗忘如何找回?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
定制建站流程步骤详解:一站式方案设计与开发指南
电商平台网站制作流程,电商网站如何制作?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何在云服务器上快速搭建个人网站?
建站主机如何选?高性价比方案全解析
如何通过FTP服务器快速搭建网站?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
h5在线制作网站电脑版下载,h5网页制作软件?
如何通过云梦建站系统实现SEO快速优化?
XML的“混合内容”是什么 怎么用DTD或XSD定义
C#如何使用XPathNavigator高效查询XML
网站制作企业,网站的banner和导航栏是指什么?
如何快速搭建高效WAP手机网站吸引移动用户?
如何通过PHP快速构建高效问答网站功能?
教程网站设计制作软件,怎么创建自己的一个网站?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建设网站制作价格,怎样建立自己的公司网站?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
建站VPS推荐:2025年高性能服务器配置指南
python的本地网站制作,如何创建本地站点?
,sp开头的版面叫什么?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
制作电商网页,电商供应链怎么做?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何续费美橙建站之星域名及服务?
如何选择香港主机高效搭建外贸独立站?
如何在云主机上快速搭建多站点网站?
建站之星安装模板失败:服务器环境不兼容?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何在Golang中指定模块版本_使用go.mod控制版本号
如何通过cPanel快速搭建网站?
C#如何在一个XML文件中查找并替换文本内容
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
建站之星Pro快速搭建教程:模板选择与功能配置指南
如何快速建站并高效导出源代码?
宝塔新建站点为何无法访问?如何排查?
建站三合一如何选?哪家性价比更高?
用v-html解决Vue.js渲染中html标签不被解析的问题
建站之星安装后如何配置SEO及设计样式?
南京网站制作费用,南京远驱官方网站?
代刷网站制作软件,别人代刷火车票靠谱吗?
动图在线制作网站有哪些,滑动动图图集怎么做?
如何在景安云服务器上绑定域名并配置虚拟主机?
*请认真填写需求信息,我们会在24小时内与您取得联系。