多线程概念,以及多线程的实现
package com.shujia.day19;
/*
多线程:
进程:
正在运行的程序,是系统进行资源分配和调用的独立单位。
每一个进程都有它自己的内存空间和系统资源。
理解:一个正在运行的软件
线程:
是进程中的单个顺序控制流,是一条执行路径
一个进程如果只有一条执行路径,则称为单线程程序。
一个进程如果有多条执行路径,则称为多线程程序。
举例:阿里云盘(进程)中多个同时进行的任务,每一个任务可以看作一个线程
1、如何创建一个线程对象呢?
a. 自定义线程类继承Thread类,重写run方法
b. 自定义线程类实现Runnable接口,实现run方法
2、如何启动一个线程呢?
调用start()方法启动
Thread无参构造方法
Thread() 分配一个新的 Thread对象。
注意:
1、启动一个线程的时候,若直接调用run方法,仅仅是普通的对象调用方法,按照自上而下的顺序执行,底层不会额外的创建一个线程再执行
2、从执行的结果上来看,java线程之间是抢占式执行的,谁先抢到cpu执行权谁就先执行
3、每次运行的结果顺序不可预测的,完全随机的
4、每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。
Thread类中的成员方法:
1、public final String getName() 获取线程对象的名字,默认是通过调用Thread无参构造方法获取的名字,从0开始
2、设置线程对象名字的方式:
a. 通过父类的有参构造方法,在创建线程对象的时候设置名字
b. 线程对象调用setName(String name)方法,给线程对象设置名字
3、获取线程的等级
getPriority() 默认优先级都是5
4、设置线程优先级,setPriority(int i),在启动之前设置 [1,10]
注意不是优先级高的一定先执行,只是可能性变高了。
Java程序运行原理
java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main 方法。所以 main方法运行在主线程中。在此之前的所有程序都是单线程的。
思考:
jvm虚拟机的启动是单线程的还是多线程的?主线程 垃圾回收线程
*/
实现一
class MyThread1 extends Thread {
MyThread1() {
}
//public Thread(String name)
MyThread1(String name) {
super(name);
}
// MyThread1(){
// //super()
// }
@Override
public void run() {
//将来线程启动后需要执行的逻辑
for (int i = 1; i <= 200; i++) {
System.out.println(this.getName() + " - Hello word " + i);
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) {
//创建一个自己的线程对象
// MyThread1 t1 = new MyThread1("徐思远"); // Thread-0
MyThread1 t1 = new MyThread1();
t1.setName("徐思远");
t1.setPriority(1);
System.out.println("t1: "+t1.getPriority());
//创建一个自己的线程对象
// MyThread1 t2 = new MyThread1("魏一民"); // Thread-1
MyThread1 t2 = new MyThread1();
t2.setName("民哥");
t2.setPriority(10);
System.out.println("t2: "+t2.getPriority());
// t1.run();
// t2.run();
t1.start();
t2.start();
}
}
实现二(更推荐)
package com.shujia.day19;
public class MyRunnable1 implements Runnable{
@Override
public void run() {
//线程要执行的逻辑
for(int i=1;i<=200;i++){
//获取当前的线程对象
System.out.println(Thread.currentThread().getName() + " - "+i);//Thread.currentThread()获取当前调用的线程
}
}
}
class RunnableDemo1{
public static void main(String[] args) {
//创建类的对象
MyRunnable1 myRunnable1 = new MyRunnable1();
//借助Thread类构造方法,创建一个线程对象
//Thread(Runnable target) 分配一个新的 Thread对象。
// Thread t1 = new Thread(myRunnable1);
// t1.setName("民哥");
// Thread t2 = new Thread(myRunnable1);
// t2.setName("陈少");
// Thread t3 = new Thread(myRunnable1);
// t3.setName("徐老祖");
//Thread(Runnable target, String name) 分配一个新的 Thread对象。并设置名字
Thread t1 = new Thread(myRunnable1,"民哥");
Thread t2 = new Thread(myRunnable1,"陈少");
Thread t3 = new Thread(myRunnable1,"徐老祖");
t1.start();
t2.start();
t3.start();
}
}