Java——线程案例

/*
实现两个人同时show

需要使用多线程
创建线程的第一种方式:
1、创建一个类继承Thread
2、重写Thread类中的run方法
        创建线程是为了执行任务
        任务代码必须有存储位置,run方法就是任务代码的存储位置
3、创建子类对象,其实就是在创建线程
4、启动线程

        主线程的任务代码在main函数中
        子线程的任务代码在Thread类的run方法中

run()方法只是一个普通的方法调用,不具备启动线程的功能
start()方法会启动线程并执行run方法中的代码

//下面这种方法也是创建了两个线程,但没有执行结果
public static void main(String[] args){
    Thread t1 = new Thread();
    Thread t2 = new Thread();

    t1.start();
    t2.start();

    以上代码执行没有结果,因为Thread类中的run方法没有实现任何功能
    因为任务代码必须写在run方法中,而Thread类中的run方法没有实现任何功能
    所以只有继承Thread类,重写run方法,即创建线程的第一种方式
}
*/
class Person extends Thread{
    private String name;

    Person(String name){
        this.name = name;
    }

    //之前
    //public void show(){
    //重写Thread类中的run方法
    //run()中的代码就是线程对应的任务代码
    //Thread.currentThread()得到一个线程对象
    //getName()是Thread.currentThread()下的方法,作用是得到该线程对象的名字
    public void run(){
        for(int i=1;i<=10;i++){
            //子线程的名字是Thread-编号  编号从0开始
            System.out.println(Thread.currentThread().getName()+"...show..."+i);
        }
    }
}
class test{
    public static void main(String[] args){ //主线程
        Person ren1 = new Person("张三");//创建了一个线程
        Person ren2 = new Person("李四");//创建了一个线程
        //主线程执行到这里时,有两个线程,主线程和垃圾回收线程
        //因为自己定义的线程并没有启动,只有启动了才开始争抢CPU

        //之前
        // ren1.show();
        // ren2.show();

        //启动线程
        ren1.start();//执行到这里有三个线程
        ren2.start();//执行到这里有四个线程

        //输出结果是随机的
        //原因:上面两个自定义的线程启动了之后,并不是真正的启动
        //      只是有了争抢CPU的资格,他们没有抢到主线程此时
        //      所占用的CPU,主线程就会先执行下面这句话
        //主线程的名字是main
        System.out.println(Thread.currentThread().getName()+"hello");

        //当所有线程全部结束,整个进程才会结束
    }
}

 测试结果

Thread-0...show...1
Thread-1...show...1
main:hello
Thread-1...show...2
Thread-1...show...3
Thread-1...show...4
Thread-0...show...2
Thread-1...show...5
Thread-1...show...6
Thread-1...show...7
Thread-1...show...8
Thread-0...show...3
Thread-1...show...9
Thread-0...show...4
Thread-1...show...10
Thread-0...show...5
Thread-0...show...6
Thread-0...show...7
Thread-0...show...8
Thread-0...show...9
Thread-0...show...10

main:hello
Thread-0...show...1
Thread-1...show...1
Thread-0...show...2
Thread-1...show...2
Thread-0...show...3
Thread-0...show...4
Thread-0...show...5
Thread-1...show...3
Thread-0...show...6
Thread-1...show...4
Thread-0...show...7
Thread-1...show...5
Thread-0...show...8
Thread-1...show...6
Thread-0...show...9
Thread-1...show...7
Thread-0...show...10
Thread-1...show...8
Thread-1...show...9
Thread-1...show...10
/*
主线程先入栈
main
ren1
之后就存在了Thread-0,会在栈中开辟内存
ren2
之后就存在Thread-1,也会在栈中开辟内存
然后就开始抢内存
当线程执行完自己的任务代码,线程就从栈中消失
当所有线程都结束了,整个进程才结束

一个线程发生异常,是该线程自己的事儿,不会影响其他线程的执行
*/
class Person extends Thread{
    private String name;

    Person(String name){
        this.name = name;
    }

    public void run(){
        for(int i=1;i<=10;i++){
            System.out.println(Thread.currentThread().getName()+"...show..."+i);
        }
    }
}
class test{
    public static void main(String[] args){
        Person ren1 = new Person("张三");
        Person ren2 = new Person("李四");
        ren1.start();
        ren2.start();

        //每个线程是相互独立的,即使主线程运行下面这段代码发生异常new ArithmeticException()
        //也不会影响上面两个线程的运行
        System.out.println(5/0);
    }
}

测试结果

Thread-1...show...1
Exception in thread "main" Thread-0...show...1
Thread-1...show...2
Thread-0...show...2
Thread-1...show...3
Thread-0...show...3
Thread-0...show...4
Thread-1...show...4
Thread-0...show...5
Thread-0...show...6
Thread-1...show...5
Thread-0...show...7
Thread-0...show...8
Thread-0...show...9
Thread-0...show...10
Thread-1...show...6java.lang.ArithmeticException: / by zero

Thread-1...show...7
Thread-1...show...8
Thread-1...show...9
Thread-1...show...10
	at cn.Thread.TestPerson.main(TestPerson.java:27)



Exception in thread "main" Thread-0...show...1
Thread-1...show...1
Thread-0...show...2
Thread-1...show...2
Thread-0...show...3
Thread-1...show...3
Thread-0...show...4
Thread-0...show...5
Thread-1...show...4
Thread-0...show...6
Thread-1...show...5
Thread-0...show...7
Thread-1...show...6
Thread-0...show...8
Thread-1...show...7
Thread-0...show...9
Thread-1...show...8
Thread-0...show...10
Thread-1...show...9
Thread-1...show...10
java.lang.ArithmeticException: / by zero
	at cn.Thread.TestPerson.main(TestPerson.java:27)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值