/*
* 一个人可以边听音乐,边打扫房间,边吃饭,边看电视。每一件事好比于一个线程,java支持多线程
* 多任务操作系统中,表面上支持进程并发执行,例如可以一边听音乐,一边聊天,但实际上这些进程不是同时运行的
* 因为所有的应用程序都是由CPU执行的。对于一个CPU而言,某个时间点只能运行一个程序,也就是说只执行一个进程。
* CPU在极短时间内在不同的进程之间进行切换,所以给人们以同时多个程序的感觉
* 一个进程有可以多个线程
* 例如,在一个java程序启动时,会产生一个进程,该进程中会默认创建一个线程,在这个线程上运行main()方法中的代码
* 前面的学习中,代码都是按顺序依次往下执行的,没有出现两段程序代码交替运行的效果这样的程序是单线程程序。
* 如果希望程序中实现多端程序代码交替运行的效果,则需要创建多个线程,即多线程程序,即一个进程执行过程中可以产生多个单线程。
* java程序中如何实现多线程呢?有两种方式,一是继承java.lang包下的Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码。
* 二是实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。
*/
//继承java.lang包下的Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码。
public class XianChengDemo {
/*
* 假设售票大厅有4个窗口可发售某日某次列车的100张车票,这时,100张车票可以看作共享资源,4个售票窗口需要建立4个线程。
* 为了更直观的显示窗口的售票情况,可以通过Thread的currentThread()方法得到当前的线程实例对象,然后调用getName()方法可以获得线程的名称
*/
public static void main(String[] args) {
TicketWindow t1 = new TicketWindow();
t1.start();//创建第一个线程对象TicketWindow并开启
TicketWindow t2 = new TicketWindow();
t2.start();//创建第二个线程对象TicketWindow并开启
TicketWindow t3 = new TicketWindow();
t3.start();//创建第三个线程对象TicketWindow并开启
TicketWindow t4 = new TicketWindow();
t4.start();//创建第四个线程对象TicketWindow并开启
}
}
class TicketWindow extends Thread {
private int tickets = 100;//初始100张票
public void run() {
while(true) {//通过死循环语句打印语句
if(tickets>0) {
Thread th = Thread.currentThread();//获取当前线程
String th_name=th.getName();//获取当前线程的名字
System.out.println(th_name+"正在发售第"+tickets--+"张票");
}
}
}
}
运行结果如下
这里每张票都被打印了4次,因为4个线程各自为战,没有共享资源100张票,在程序中创建了4个 TicketWindow 对象,每个线程都有自己的名字,主线程默认main,其他Thread-0,Thread-1依次类推。
接下来我们用Runnale接口来写,并使用构造方法Thread(Runnable target,String name)在创建线程对象的同时指定线程名字
// 上面程序每张票被卖出4次,因为4个线程没有共享100张票,在程序中创建4个TicketWindow对象,就等于创建了4个售票程序。
// 实际要求4个线程应该运行同一个售票程序,应该只创建一个TicketWindow对象,用线程的第二种方法用java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。
public class XianChengDemo {
/*我们创建了四个线程,但是每个线程都去调用这个 TicketWindow对象的run()方法,确保了4个线程访问的是同一个tickets变量,共享100张车票*/
public static void main(String[] args) {
TicketWindow tw = new TicketWindow();//创建一个线程对象TicketWindow
Thread t1 = new Thread(tw,"窗口1");//创建线程并起名为窗口1,然后开启
t1.start();
Thread t2 = new Thread(tw,"窗口2");//创建线程并起名为窗口2,然后开启
t2.start();
Thread t3 = new Thread(tw,"窗口3");//创建线程并起名为窗口3,然后开启
t3.start();
Thread t4 = new Thread(tw,"窗口4");//创建线程并起名为窗口4,然后开启
t4.start();
}
}
class TicketWindow implements Runnable {
private int tickets = 100;//初始100张票
public void run() {
while(true) {//通过死循环语句打印语句
if(tickets>0) {
Thread th = Thread.currentThread();//获取当前线程
String th_name=th.getName();//获取当前线程的名字
System.out.println(th_name+"正在发售第"+tickets--+"张票");
}
}
}
}
运行结果如下