/*
实现两个人同时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)