如何开启多线程
/*一个类要想开启多线程有两种方法。
第一 种 : 就是继承java中自带的Thread类
开启多线程要求:
1, 继承Thread类
2。重写Thread类中的run方法 为什么? 因为run方法中封装的就是开启多线程你想要同时运行的代码
3.创建继承Thread类的子类的对象创建线程。 因为该子类继承了线程Thread类,那么该子类便也是属于了线程类,就像一个类继承了异常类
4.调用start方法 为什么呢? 因为如果不调用start方法,直接调用run方法,那么就和普通一个对象兼用一个方法没有区别!!!
调用start方法才是开启多线程!!!!注意:调用了start方法,也就意味着调用了run方法,因为start方法会自动调用run方法!!!
*/
class Zi extends Thread{
private String name;
public Zi(String name){
this.name = name;
}
public void run(){
for(int x=0;x<10;x++)
System.out.println(name+x);
}
}
public class ThreadDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Zi z1 = new Zi("超哥");
Zi z2 = new Zi("二孟");
z1.run();
z2.run();
//以上 结果 依然按照单线程顺序执行
Zi z3 = new Zi("超哥");
Zi z4 = new Zi("二孟");
z3.start();
z4.start();
//输出结果是 开启了多线程,随机输出!!!!
}
}
第二种 :开启多线程的方法
//实现Runnable接口
/*
java中Thread类的大致写法:
class Thread{
private Runnable r Runnable是一个接口!!!
public Thread(){
}
public Thread(Runnable r){
this.r = r;
}
public void run(){
if(r!=null)
r.run();
}
public void start(){
run();
}
}
*/
class DeChao implements Runnable{
public void run(){
show();
}
public void show(){
for(int x=0;x<10;x++){
System.out.println(x+Thread.currentThread().getName());
//getName()是获取线程!
//而 Thread.currentThread().getName() 是获取 当前 线程
//当前线程的写法: Thread-编号(编号从0开始!)
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
DeChao d = new DeChao();//因为没有继承Thread类,所此时创建对象,并没有创建多线程!!!!
Thread t =new Thread(d);//创建多线程!1既然没有继承多线程类那就用java自带的多线程类,创建线程!!!!
t.start();//开启多线程!
System.out.println(Thread.currentThread().getName());
//为什么用t调用start方法???
//因为DeChao类并没有继承Thread类,没有start方法!
}
}
练习
/*
*需求:卖票
**/
class ErMeng implements Runnable{
private static int num = 100;//为什么要写静态呢? 因为e1,e2共同卖100张票,所以我要让他e1,e2共享一个num
//可以不写static也实现这种功能吗?
//可以,让创建的线程共用一个对象!
public void run(){
shouMai();
}
public void shouMai(){
while(true){//为什么要写上if呢?不是已经有while条件了吗? 因为如果不写if,下面的输出语句会一直输出,所以加上if,当不满足if条件时,我就不输出,尽管while还在运行!!!
if(num>0)
System.out.println(Thread.currentThread().getName()+“正在售卖第”+num–+“张票”);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ErMeng e1 = new ErMeng();
//ErMeng e2 = new ErMeng();
Thread t1 = new Thread(e1);
Thread t2= new Thread(e1);//创建了两个线程
t1.start();
t2.start();//开启了两个线程
}
}