欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 小白多线程

程序员文章站 2022-05-02 10:25:48
...

Java 小白多线程
通常比较常用的方式有两种
一、继承Thread类

public class KeyPersonThread extends Thread {
    public void run() {
        System.out.println(Thread.currentThread().getName() + "开始了战斗!");
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "左突右杀,攻击随军!");
        }
        System.out.println(Thread.currentThread().getName() + "结束了战斗!");
    }
}

// 初始化
Thread mrCheng = new KeyPersonThread();
mrCheng.setName("程咬金");
mrCheng.start();

二、实现Runnable接口

public class ArmyRunnable implements Runnable {
    // volatile 保证了线程可以正确读取其他线程写入的值
    // 可见性
    volatile boolean keepRunning = true;
    public void run() {
        while (keepRunning) {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "进攻对方["+i+"]");
                Thread.yield();
            }
        }
        System.out.println(Thread.currentThread().getName() + "结束战斗!");
    }
}

// 初始化
ArmyRunnable armyRunnableTask1 = new ArmyRunnable();
Thread thread1 = new Thread(armyRunnableTask1, "随军");

thread1.start();

主要的方法

  1. yield() 调用此方法的线程,释放当前CPU的执行权
  2. join() 在A线程中调用B线程的join()方法 表示 : 当执行到此方法,A线程停止执行 直至B线程执行完毕.A线程再接着join()之后的代码执行
  3. currentThread()静态的调取当前的线程
  4. setName() 设置此线程的名字
  5. getName() 获取当前线程名
  6. sleep() 休眠

三、线程间通信 同步

private final Object lock = new Object();

        synchronized (lock) {

            // 某种约束条件 导致线程等待
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 等待完毕 执行代码成功 通知其他线程 继续获取资源执行
            lock.notifyAll();
        }

通过wait notify notifyAll 进行线程的加锁阻塞,同步处理敏感数据操作。

还有一种方式将操作共享数据的方法声明为synchronized。即此方法为同步方法,能够保证当其中一个线程执行此方法时,其它线程在外等待直至此线程执行完此方法。

四、线程的停止

  1. 推荐:使用标记位进行处理
  2. interupt 停止,需要根据api, isInterupted 进行判断和第1步中类似
相关标签: 线程