浅谈java中的线程的两种实现方式Runable接口和Thread类及火车站售票仿真

一、进程和线程的区别

1.1什么是进程?

进程就是当前正在运行的程序,专业一点说就是应用程序在内存中的执行区域

1.2什么是线程?

线程就是进程中的一个执行控制单元,执行路径,一个进程可以有一个线程叫做单线程,也可以有多个线程叫多线程

单线程:安全性高,效率低

多线程:安全性低,效率高

二、线程实现的两种方式

2.1用继承Thread类的方法实现

public class MyThread1 extends Thread{
	public void run() {
		for(int i=0;i<5;i++) {
			System.out.println(getName()+":"+i);//继承了Thread类直接调用Thread类中的方法
		}
	}
	public static void main(String args[]) {
		MyThread1 t=new MyThread1();
		t.setName("线程1");
		MyThread1 t1=new MyThread1();
		t.start();
		t1.setName("线程2");
		t1.start();
		
	}

}

运行结果

 

2.2Runnable接口实现

public class MyThread implements Runnable {
	public static void main(String args[]) {
		Runnable tt=new MyThread();
		Thread t1=new Thread(tt);//创建一个线程
		t1.setName("线程1");
		t1.start();
		Thread t2=new Thread(tt);
		t2.setName("线程2");
		t2.start();	
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<5;i++) {
			System.out.println(Thread.currentThread().getName()+":"+ i);
		}
		
	}
	

}

运行结果

从运行结果看细心的人应该可以看到线程的运行顺序并不是向我们调用方法那样一个方法运行结束才会向下去运行另一个方法,而是两个线程执行的顺序不一定,其实这是CPU执行的结果,CPU在每个线程做着非常快速的选择,也就是说执行哪个线程是随机的先执行哪一个线程也是随机的!

2.3Runable和Thread区别

Runnable中必须重写run()方法,Thread不用

线程运行的都是run()方法

建议选择用Runnable接口方法,这是因为java继承决定的,java只能继承一个类,我需要继承其他的类,但是如果我选择了继承Thread类,那么我就无法去继承我向继承的其他类了

三、多线程模仿火车站售票

public class MyThread implements Runnable {
	static int tickets = 10;
	Object object = new Object();// 创建一个object类让所有成员访问

	public static void main(String args[]) {
		Runnable tt = new MyThread();
		Thread t1 = new Thread(tt);

		t1.setName("窗口一");
		t1.start();
		Thread t2 = new Thread(tt);
		t2.setName("窗口二");
		t2.start();
		Thread t3 = new Thread(tt);
		t3.setName("窗口三");
		t3.start();

	}

	@Override
	public  void run() {
		// TODO Auto-generated method stub
		while (true) {
			synchronized(object){if (tickets >0) {
				try {
					Thread.sleep(300);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + ":" + tickets--);
			}
		}
	   }
	}

}

在这个程序中我加入了一个Object类,用这个类封装run方法,是为了让所有成员都能访问这个方法,synchronized用这个修饰是上锁只要有一个线程进入run()方法就会被上锁,其他线程都无法访问,这是同步代码块的方法还有一种方法是同步方法直接给run()方法加上关键字synchronized也可以!如果不使用这个修饰改进代码运行会出现问题!希望你们自己去运行实现以下,这个疑问留给你们去探讨!欢迎留言!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值