多线程(多窗口卖票实例讲解)

论坛 期权论坛 脚本     
niminba   2021-5-23 02:43   1627   0

实现多线程的方式:

实现多线程的方式有多种,这里只列举两种常用的,而第一种继承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
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛