public class ThreadDemo extends Thread { /* * 学习多线程之前,我们先要了解几个关于多线程有关的概念。 A:进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。 B:线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。 一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 C:简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 什么是多线程呢?即就是一个程序中有多个线程在同时执行。 */ /* * 多线程的实现方式: * 方式1:一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例 * * Thread * String getName() 返回该线程的名称。 * void setName(String name) 改变线程名称,使之与参数 name 相同。 * * * CPU执行程序的随机性 */ public static void main(String[] args) { ThreadDemo threadDemo=new ThreadDemo(); threadDemo.setName("线程一");//设置线程的名字 threadDemo.start(); ThreadDemo mtDemo=new ThreadDemo(); mtDemo.setName("线程二"); mtDemo.start(); } public void run() {//start()启动线程程序 for(int i=0;i<10;i++) { System.out.println(getName()+" "+i); } } }
import java.util.concurrent.ConcurrentLinkedDeque; /* * 实现线程二:实现Runnable接口 创建线程的另一种方法是声明实现 Runnable 接口的类。 该类然后实现 run 方法。然后创建Runnable的子类对象, 传入到某个线程的构造方法中,开启线程。 为何要实现Runnable接口,Runable是啥玩意呢?继续API搜索。 查看Runnable接口说明文档:Runnable接口用来指定每个线程要执行的任务。 包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。 */ public class ThreadDemo2 implements Runnable { @Override public void run() { for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { ThreadDemo2 threadDemo2=new ThreadDemo2(); Thread t=new Thread(threadDemo2); Thread thread=new Thread(threadDemo2); t.setName("线程一"); thread.setName("线程二"); t.start(); thread.start(); } }
窗口售票
public class TicktetTest implements Runnable { int tickets=100; int all=0; public static void main(String[] args) { TicktetTest ticktetTest=new TicktetTest(); Thread t1=new Thread(ticktetTest); t1.setName("窗口一:"); Thread t2=new Thread(ticktetTest); t2.setName("窗口二"); Thread t3=new Thread(ticktetTest); t3.setName("窗口三"); t1.start(); t2.start(); t3.start(); } @Override public void run() { // TODO Auto-generated method stub while(true) { if(tickets>0) { System.out.println(Thread.currentThread().getName()+" "+"售出一张车票"+--tickets); } else { System.out.println(Thread.currentThread().getName()+":售票结束"); break; } } } }
public class TicktetTest implements Runnable { int tickets=100; Object obj=new Object(); int all=0; public static void main(String[] args) { TicktetTest ticktetTest=new TicktetTest(); Thread t1=new Thread(ticktetTest); t1.setName("窗口一:"); Thread t2=new Thread(ticktetTest); t2.setName("窗口二"); Thread t3=new Thread(ticktetTest); t3.setName("窗口三"); t1.start(); t2.start(); t3.start(); } @Override public void run() { // TODO Auto-generated method stub while(true) { /* * 同步方法:使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部锁住,其他线程则无法访问 * * synchronized * 注意: * 非静态同步方法的锁对象是this * 静态的同步方法的锁对象是当前类的字节码对象 */ synchronized (obj) {//同步安全性高,效率低。 if(tickets>0) { System.out.println(Thread.currentThread().getName()+" "+"售出一张车票"+--tickets); } else { System.out.println(Thread.currentThread().getName()+":售票结束"); break; } } } } }