实现多线程的方式:
实现多线程的方式有多种,这里只列举两种常用的,而第一种继承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
|
|
|
|