同一个进程的线程之间,共用了同一份资源
将上述代码该为while(true)
package thread;
//创建一个类,继承来自Thread
class MyThread extends Thread{
public void run(){
//这个方法就是线程的入口方法
while (true){
System.out.println("hello thread");
}
}
}
public class Demo1 {
public static void main(String[] args) {
Thread t=new MyThread();
//start和run都Thread的成员
//run只是描述了线程的入口(线程要做什么任务)
//start择时真正调用了系统API,在系统中创建出线程,让线程再调用run
t.start();
while (true){
System.out.println("hello main");
}
}
}
可以看到,这两个while循环在 ”同时执行“ ,看到的结果是,两边的日志都在交替打印
说明:每个线程都是一个独立执行的逻辑(独立执行流)
把 t.start 改成 t.run ,此时,代码中不会创建出新的线程,只有一个主线程。
这个主线程里面只能依次执行循环,执行完一个循环再执行另一个。
因为 t.run 里有一个循环,这个循环没有结束,所有一直无法执行到 ”hello main“ 这个循环了
此时的运行结果就只有 ”hello thread“
循环太快,希望慢一点,在循环体里加上sleep
sleep方法可能会抛出一个异常,这个异常时受查异常,必须时显式处理,此处必须try catch,不能 throws,在这个代码中是重写父类的 run,父类的 run 没有throws,子类方法也不能有throws
但是在mian方法里由于是自己定义的,所有可以throws
package thread;
//创建一个类,继承来自Thread
class MyThread extends Thread{
public void run(){
//这个方法就是线程的入口方法
while (true){
System.out.println("hello thread");
try{
Thread.sleep(1000);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
public class Demo1 {
public static void main(String[] args) throws InterruptedException{
Thread t=new MyThread();
//start和run都Thread的成员
//run只是描述了线程的入口(线程要做什么任务)
//start择时真正调用了系统API,在系统中创建出线程,让线程再调用run
t.start();
//t.run();
while (true){
System.out.println("hello main");
Thread.sleep(1000);
}
}
}
运行结果如图,每秒钟打印出来的内容,顺序是不确定的,这两个线程都是休眠1000ms,当时间到了之后,这俩线程谁先执行谁后执行不一定,这个过程可以视为”随机“的
快捷键:ctrl+alt+t
ctrl+1
Thread类的其它写法:
继承Thread,重写run
实现Runnable,重写run
表示一个“可以运行的任务”,这个任务是交给线程负责执行,还是交给其它的实体来执行,Runnable本身并不关心
通过这个操作,调用系统api来完成创建线程的工作
class MyRunnable implements Runnable{
@Override
public void run() {
while(true){
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Demo1{
public static void main(String[] args) {
Runnable runnable=new MyRunnable();
Thread t=new Thread(runnable);
t.start();
while(true){
System.out.println("hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}