多线程
java语言的JVM允许程序运行多个线程。它可以通过java.lang.Thread类来实现
- 新建一个类继承于Thread类–重写Thread类中的run()方法,在该方法中写需要多线程执行的方法体,在main()方法中调用Thread类中的start()方法
代码示例
package thread;
/**
*
* 多线程的创建:
* 方式一:继承于Thread类
*(1)创建一个继承于Thread类的子类
*(2)重写Thread类的run()--->将此线程执行的操作声明在run()中
*(3)创建Thread类的子类的对象
* (4)通过对象调用start()
* @param args
*
* Created by KingsLanding on 2022/3/8 19:12
*/
public class ThreadTest {
public static void main(String[] args) {
MyThread m1 = new MyThread();//new一个Thread的子类的对象
//调用Thread类中的start()方法;启动当前线程,调用当前线程的run()
//不用等待,新建了一个线程,并行运行,输出Thread-i,即在Thread线程中执行
m1.start();
//一个对象只能调用一次start()
//不能通过直接调用run()的方式启动线程,这种方式仍然是在主线程中运行,输出main-i
m1.run();
//以下操作任然在主线程中
for(int i=0;i<=100;i++){
if(i%2==0){
//输出main-i
System.out.println(Thread.currentThread().getName()/*获取线程的名字*/+"-"+i);
}
}
}
}
//创建一个继承于Thread类的子类
class MyThread extends Thread{
//重写Thread类的run()方法
@Override
public void run() {
//遍历0-100的偶数
for(int i=0;i<=100;i++){
if(i%2==0){
System.out.println(Thread.currentThread().getName()/*获取线程的名字*/+"-"+i);
}
}
}
}
Thread的常用方法
package thread;
/**
* 测试Thread类中的常用方法:
* 1.start();启动当前线程,调用当前线程的方法体run()
* 2.run();重写Thread类中的run()方法,将需要线程实现的方法体写在其中
* 3.currentThread();静态方法,返回执行当前代码的线程
* 4.getName();获取当前线程的名字
* 5.setName();设置当前线程的名字:在调用之前设置【对象.setName("名称")】;
* 给主线程改名【Thread.currentThread.setName("名称")】
* 6.yield():释放当前CPU的执行权
* 7.join():掐断原本的线程,切换到其他线程,执行完后再返回调用
* 在线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到b线程执行完再执行a
* 8.stop();已过时,执行此方法时,强制结束当前线程
* 9.sleep(long millitime);阻塞,在指定的millitime毫秒时间内,当前线程阻塞状态
* 10.isAlive();判断当前线程是否存活
*
*
* Created by KingsLanding on 2022/3/9 13:51
*/
public class ThreadTest02 {
public ThreadTest02() {
}
public static void main(String[] args) {
Mythread m1 = new Mythread();
m1.setName("线程-1");
m1.start();
//改主线程的名字
Thread.currentThread().setName("主线程-2");
for(int i=0;i<=100;i++){
if(i%2==0){
System.out.println(Thread.currentThread().getName()+"/*****/"+i);
}
//强行换路
if(i==50){
try {
m1.join();//该条件触发时,掐断原本的线程,切换到其他线程,
// 直到那个线程执行完成后再调用本身这个线程
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}
class Mythread extends Thread{
@Override
public void run() {
for(int i=0;i<=100;i++){
if(i%2 != 0){
//sleep阻塞线程,单位毫秒
try {//快捷键:ctrl+alt+T
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
}
System.out.println(Thread.currentThread().getName()+"/*****/"+i);
}
if(i%10==0){
yield();//当i可以除以10 线程主动停止一下,但仍然会再次调用线程
}
}
}
}