Java基础:继承Thread类的方式创建多线程

多线程

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 线程主动停止一下,但仍然会再次调用线程
            }
        }
    }
}

你可能感兴趣的:(java,jvm,开发语言)