目录

创建线程

Thread类常用方法


创建线程

主线程

java 创建新线程然后释放内存_thread

 

单线程的弊端:从上至下的执行

Person类中有一个循环打印方法run

public static void main(String[] args) {
        Person p1=new Person("小强");
        p1.run();
 System.out.println(0/0);//写一个异常
        Person p2=new Person("旺财");
        p2.run();
    }

java 创建新线程然后释放内存_thread_02

可得p2.run没有执行

 

 

Thread类

线程是程序中的执行线程,Java虚拟机允许应用程序并发地运行多个执行线程。

 

 

创建新执行线程的两种方法

 

多线程的第一种方式

Thread类是描述线程的类,我们要实现多线程程序,就必须继承Thread类

实现步骤

    1、创建一个Thread类的子类

    2、在Thread类的子类中重写run方法,设置线程任务

    3、创建Thread类的子类对象

    4、调用Thread类中的方法start,开启新的线程,执行run方法

  结果是两个线程并发的运行;当前线程(从调用返回给start方法)和另一个线程(执行其run方法)。

  多次启动一个线程是非法的,特别是当线程已经结束执行后,不能再重新启动。

调度问题:java是抢占式,看优先级,同一优先级,随机选择一个执行

*/
public class Demo2 {
    public static void main(String[] args) {
        MyThread myThread=new MyThread();
        myThread.start();
        for (int i=0;i<20;i++){
            System.out.println("main"+i);
        }
    }
}

java 创建新线程然后释放内存_多线程_03

多线程类

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i=0;i<20;i++){
            System.out.println("run"+i);
        }
    }
}

 

 

多线程原理:

JVM执行main方法,找OS开辟一条main方法通向cpu的路径,该路径叫做main线程、主线程

cpu通过该路径执行main方法

当创建多线程类对象的时候就又开辟了新的路线,执行run方法

当优先级相同,main和run会抢夺cpu执行权,谁抢到了谁就执行对应的代码

 

内存图解

java 创建新线程然后释放内存_多线程_04

Thread类常用方法



Thread类的常用方法

获取线程的名称:

    1、getName()返回线程的名称

    2、获取当前正在执行的线程,使用线程中的方法getName()获取名称

        static Thread currentThread()返回对当前正在执行线程对象的引用

由执行的结果可得:

    线程的名称:

    主线程:main

    新线程:Thread-0开始、Thread1...

*/
public class Demo3 {
    public static void main(String[] args) {
        MyThread myThread=new MyThread();
        myThread.start();//Thread-0
       new MyThread().start();
       new MyThread().start();
 //也可以获取主线程的名称
        System.out.println(Thread.currentThread().getName());
    }
}

 

run方法:

public void run() {
  //获取线程名称
       /* System.out.println(getName());*/
       /* Thread thread = Thread.currentThread();
        System.out.println(thread);
        System.out.println(thread.getName());*/
//链式写法
 System.out.println(Thread.currentThread().getName());
    }

java 创建新线程然后释放内存_java 创建新线程然后释放内存_05

 

设置线程的名称:

1、使用Thread类中的setName方法,改变线程名称,使之与参数name相同

2、创建一个带参数的构造方法,参数传递线程的名称,调用父类的带参构造方法,把线程名称传递给父类,让父类(Thread)给子线程起一个名字

 

演示:

run方法:

public void run() {
      //获取线程名称
        System.out.println(Thread.currentThread().getName());
    }
main:
 public static void main(String[] args) {
        /*方式1
        MyThread myThread=new MyThread();
        myThread.setName("小强");
        myThread.start();*/
   //方式二带参构造方法
        MyThread myThread=new MyThread("旺财");
        myThread.start();
    }

java 创建新线程然后释放内存_thread_06

 

public static void sleep (long millis):使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)

 

演示

public class Demo5 {
    public static void main(String[] args) {
//这里拿主线程做测试
        for (int i=0;i<=60;i++) {
 //模拟时钟1s钟+1
            System.out.println(i);
            try {
  //sleep会抛异常需要捕获
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

java 创建新线程然后释放内存_java_07

1s+1直到60