2016.12.02
明天,哦不对,准确来说应该是今天考现场总线,就看了一点,但求不挂,今年的课都不知所云,练车,上课,实验,考试,各种忙。哈哈,不过值得庆幸的是,连续几天敲代码,竟然有了感觉,现在遇到了各种牛人,感觉能学到好多东西,也深深体会到自己作为一个学渣该好好学习了。
自定义线程一般有两种方式:
方式一:
1.自定义一个类继承Thread类
2.重写Thread类中的run方法,把自定义线程的任务写在run()方法上
3.创建Thread的子类对象,并且调用start方法启动一个线程
注意:千万不要直接调用run()方法,调用start方法的时候线程开启,线程开启就会直接调用run();如果直接调用run()方法,就相当于调用了一个普通方法。
方式二:
1.自定义一个类实现Runnable接口。
2.实现Runable接口的run方法,把自定义线程的任务定义在run()方法上。
3.创建Runnable实现类对象。
4.创建Thread类的对象,并且把Runnable()实现类的对象作为参数进行传递。
5.调用Thread对象的start方法开启一个线程。
public class Demo2 implements Runnable{
public void run(){
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public static void main(String[] args) {
//创建Runnable实现类的对象
Demo2 d = new Demo2();
//创建Thread类的对象, 把Runnable实现类对象作为实参传递。
Thread t = new Thread(d,"庹成");//Thread类使用Target变量记录了d对象,
//调用thread对象的start方法开启线程。
t.start();
/*
Thread类 的run方法
* @Override
public void run() {
if (target != null) {
target.run(); //就相当于Runnable实现类的对象的run方法作为了Thread对象的任务代码了。
}
}
*/
}
}
这里有两个问题:
问题1.请问Runnable实现类的对象是线程对象吗?
Runnable实现类的对象不是一个线程对象,只不过是实现了Runnable接口的对象而已。
问题2.为什么要把Runnable实现类的对象作为实参传递给Thread对象呢?作用是什么?
作用就是把Runnable实现类的对象的run()方法作为了线程的任务代码去执行了。
推荐使用第二种,实现Runnable接口。因为java是单继承,多实现的
class SaleTicket implements Runnable{
int num = 50; // 票数
@Override
public void run() {
while(true){
synchronized ("锁") {
if(num>0){
System.out.println(Thread.currentThread().getName()+"售出了第"+ num+"号票");
num--;
}else{
System.out.println("售罄了..");
break;
}
}
}
}
}
public class Demo4 {
public static void main(String[] args) {
//创建了一个Runnable实现类的对象
SaleTicket saleTicket = new SaleTicket();
//创建三个线程对象模拟三个窗口
Thread thread1 = new Thread(saleTicket,"窗口1");
Thread thread2 = new Thread(saleTicket,"窗口2");
Thread thread3 = new Thread(saleTicket,"窗口3");
//开启线程售票
thread1.start();
thread2.start();
thread3.start();
}
}
这里为什么不用static来修饰int num,会不会产生150张票,答案是不会,因为只创建了一个SaleTicket对象,加了之后不会怎样,就是java的生命周期变长了。