目录
创建线程
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();
}
可得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);
}
}
}
多线程类
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执行权,谁抢到了谁就执行对应的代码
内存图解
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());
}
设置线程的名称:
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();
}
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();
}
}
}
1s+1直到60