Java线程Thread类常用方法

news2024/12/28 14:34:49

文章目录

  • 1. start():启动线程,使其执行run()方法中的代码。
  • 2. run():线程的执行逻辑,需要在该方法中定义线程要执行的代码。
  • 3. sleep(long millis):使当前线程暂停指定的毫秒数,进入阻塞状态。
  • 4. join():等待线程执行完毕,即阻塞当前线程,直到该线程执行完成。
  • 5. interrupt():中断线程,给线程发送中断信号。
  • 6. isInterrupted():判断当前线程是否被中断。
  • 7. getName():获取线程的名称。
  • 8. setName(String name):设置线程的名称。
  • 9. isAlive():判断线程是否还存活,即线程是否执行完毕或被中断。
  • 10. yield():暂停当前正在执行的线程,并允许其他线程执行。
  • 11. setPriority(int priority):设置线程的优先级。
  • 12. getPriority():获取线程的优先级。

thread2

1. start():启动线程,使其执行run()方法中的代码。

start()方法用于启动一个线程,使其执行run()方法中的代码。start()方法会创建一个新的线程,并使其进入就绪状态,等待调度执行。

下面是一个简单的示例,演示了如何使用start()方法启动一个线程:

public class MyThread extends Thread {
    public void run() {
        System.out.println("Thread running");
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}

在上面的示例中,我们定义了一个继承自Thread类的MyThread类,重写了run()方法,在run()方法中输出一句话。在main()方法中,我们创建了一个MyThread对象,并使用start()方法启动了该线程。当程序运行时,会创建一个新的线程,并执行MyThread类中的run()方法,输出"Thread running"。

需要注意的是,start()方法只能在一个线程中被调用一次。如果我们尝试多次调用start()方法,会抛出IllegalThreadStateException异常。另外,start()方法会在内部自动调用run()方法,我们不应该直接调用run()方法来启动一个线程,而应该使用start()方法来启动线程。

2. run():线程的执行逻辑,需要在该方法中定义线程要执行的代码。

run()方法是Thread类中定义的线程执行逻辑的方法。当一个线程通过start()方法启动后,会自动调用run()方法来执行线程的代码逻辑。

下面是一个简单的示例,演示了如何使用run()方法定义线程的执行逻辑:

public class MyThread implements Runnable {
    public void run() {
        System.out.println("Thread running");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}

在上面的示例中,我们定义了一个实现了Runnable接口的MyThread类,重写了run()方法,在run()方法中输出一句话。在main()方法中,我们创建了一个Thread对象,并将MyThread对象作为参数传递给Thread的构造函数。然后,我们通过start()方法启动了该线程。当程序运行时,会创建一个新的线程,并执行MyThread类中的run()方法,输出"Thread running"。

需要注意的是,Runnable接口是实现多线程的另一种方式,相比于直接继承Thread类,使用Runnable接口更加灵活,因为Java中不支持多重继承,而实现接口可以避免这个限制。另外,使用Runnable接口实现多线程时,需要将实现了Runnable接口的对象作为参数传递给Thread的构造函数,然后通过Thread对象来启动线程。

3. sleep(long millis):使当前线程暂停指定的毫秒数,进入阻塞状态。

sleep(long millis)是Thread类中的一个静态方法,用于使当前线程进入休眠状态指定的时间。

下面是一个简单的示例,演示了如何使用sleep()方法使线程休眠:

public class SleepDemo {
    public static void main(String[] args) {
        System.out.println("Thread 1 running");
        try {
            Thread.sleep(2000); // 使当前线程休眠2秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread 1 resumed");

        System.out.println("Thread 2 running");
        try {
            Thread.sleep(3000); // 使当前线程休眠3秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread 2 resumed");

        System.out.println("Main thread finished");
    }
}

在上面的示例中,我们通过调用Thread.sleep()方法使当前线程休眠了一段时间。在第一次调用Thread.sleep(2000)后,当前线程会暂停执行2秒钟,然后继续执行下面的代码。在第二次调用Thread.sleep(3000)后,当前线程会再次暂停执行3秒钟,然后继续执行下面的代码。

需要注意的是,Thread.sleep()方法可能会抛出InterruptedException异常,这是因为当线程处于休眠状态时,其他线程可以通过调用该线程的interrupt()方法来中断它的休眠,从而抛出InterruptedException异常。因此,在使用Thread.sleep()方法时,需要处理这个异常。

另外,需要注意的是,Thread.sleep()方法是静态方法,所以可以直接通过类名来调用,不需要实例化线程对象。

4. join():等待线程执行完毕,即阻塞当前线程,直到该线程执行完成。

join()方法是Thread类中的一个实例方法,用于等待当前线程执行完毕。

下面是一个简单的示例,演示了如何使用join()方法等待其他线程执行完毕:

public class JoinDemo {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable(), "Thread 1");
        Thread thread2 = new Thread(new MyRunnable(), "Thread 2");

        thread1.start();
        thread2.start();

        try {
            thread1.join(); // 等待Thread 1执行完毕
            thread2.join(); // 等待Thread 2执行完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread finished");
    }

    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + " running");
            try {
                Thread.sleep(2000); // 模拟线程执行时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(threadName + " finished");
        }
    }
}

在上面的示例中,我们创建了两个线程thread1和thread2,并通过调用start()方法启动它们。然后,使用join()方法在主线程中等待thread1和thread2执行完毕。

使用join()方法的效果是,主线程会暂停执行,直到thread1和thread2执行完毕之后才会继续执行下面的代码。这样可以保证在主线程继续执行之前,thread1和thread2已经执行完毕。

需要注意的是,join()方法也可能会抛出InterruptedException异常,因此需要进行异常处理。

另外,需要注意的是,join()方法是实例方法,所以需要通过线程对象来调用。在示例中,我们创建了两个线程对象thread1和thread2,并通过调用它们的join()方法来等待它们的执行完毕。

5. interrupt():中断线程,给线程发送中断信号。

interrupt()方法是Thread类中的一个实例方法,用于中断线程的执行。

下面是一个简单的示例,演示了如何使用interrupt()方法中断线程的执行:

public class InterruptDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable(), "MyThread");
        thread.start();

        try {
            Thread.sleep(2000); // 主线程睡眠2秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        thread.interrupt(); // 中断线程的执行
    }

    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("Thread running");

                try {
                    Thread.sleep(500); // 线程睡眠500毫秒
                } catch (InterruptedException e) {
                    System.out.println("Thread interrupted");
                    Thread.currentThread().interrupt(); // 重新设置中断标志位
                }
            }

            System.out.println("Thread finished");
        }
    }
}

在上面的示例中,我们创建了一个线程thread,并通过调用start()方法启动它。然后,主线程睡眠2秒钟后,调用thread的interrupt()方法来中断线程的执行。

在线程的run()方法中,我们使用了一个while循环来检查线程的中断状态。只要线程没有被中断,就会一直执行循环中的代码。在循环中,我们打印一条信息并让线程睡眠500毫秒。

当线程被中断时,会抛出InterruptedException异常。在异常处理代码中,我们打印一条中断信息,并通过调用Thread.currentThread().interrupt()方法重新设置线程的中断标志位,以便在下一次循环时能够检测到线程被中断。

当线程检测到中断状态时,会退出循环并打印一条线程结束的信息。

需要注意的是,interrupt()方法只是设置线程的中断标志位,实际上并不会强制停止线程的执行。在线程的代码中需要通过检查中断状态来决定是否继续执行。

6. isInterrupted():判断当前线程是否被中断。

isInterrupted()方法是Thread类中的一个实例方法,用于判断线程是否被中断。

下面是一个简单的示例,演示了如何使用isInterrupted()方法来判断线程是否被中断:

public class IsInterruptedDemo {
    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();

        try {
            Thread.sleep(2000); // 主线程睡眠2秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        thread.interrupt(); // 中断线程的执行
    }

    static class MyThread extends Thread {
        @Override
        public void run() {
            while (!isInterrupted()) {
                System.out.println("Thread running");

                try {
                    Thread.sleep(500); // 线程睡眠500毫秒
                } catch (InterruptedException e) {
                    System.out.println("Thread interrupted");
                    interrupt(); // 重新设置中断标志位
                }
            }

            System.out.println("Thread finished");
        }
    }
}

在上面的示例中,我们创建了一个继承自Thread类的MyThread类,并重写了其run()方法。在run()方法中,我们使用了一个while循环来检查线程的中断状态。只要线程没有被中断,就会一直执行循环中的代码。在循环中,我们打印一条信息并让线程睡眠500毫秒。

当线程被中断时,会抛出InterruptedException异常。在异常处理代码中,我们打印一条中断信息,并通过调用interrupt()方法重新设置线程的中断标志位,以便在下一次循环时能够检测到线程被中断。

使用isInterrupted()方法可以在任何地方判断线程是否被中断。在本例中,我们在循环条件中使用isInterrupted()方法来判断线程是否被中断,如果被中断则跳出循环。

需要注意的是,isInterrupted()方法只是返回线程的中断状态,并不会清除中断标志位。因此,在重新设置中断标志位时,需要调用interrupt()方法。

7. getName():获取线程的名称。

getName()方法是Thread类中的一个实例方法,用于获取线程的名称。

下面是一个简单的示例,演示了如何使用getName()方法来获取线程的名称:

public class GetNameDemo {
    public static void main(String[] args) {
        Thread thread1 = new MyThread("Thread 1");
        Thread thread2 = new MyThread("Thread 2");

        thread1.start();
        thread2.start();
    }

    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            System.out.println("Thread name: " + getName());
        }
    }
}

8. setName(String name):设置线程的名称。

getName()方法是Thread类中的一个实例方法,用于获取线程的名称。

下面是一个简单的示例,演示了如何使用getName()方法来获取线程的名称:

public class GetNameDemo {
    public static void main(String[] args) {
        Thread thread1 = new MyThread("Thread 1");
        Thread thread2 = new MyThread("Thread 2");

        thread1.start();
        thread2.start();
    }

    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            System.out.println("Thread name: " + getName());
        }
    }
}

在上面的示例中,我们创建了一个继承自Thread类的MyThread类,并在构造方法中传入线程的名称。在run()方法中,我们使用getName()方法来获取线程的名称,并打印出来。

在main()方法中,我们创建了两个MyThread对象,并分别给它们指定了不同的名称。然后,我们调用start()方法启动这两个线程。
运行该示例,会输出如下结果:

Thread name: Thread 1
Thread name: Thread 2

可以看到,每个线程都成功获取到了自己的名称并打印出来。

通过getName()方法,我们可以在任何需要的地方获取到线程的名称。这在多线程编程中非常有用,可以帮助我们区分和识别不同的线程。

9. isAlive():判断线程是否还存活,即线程是否执行完毕或被中断。

isAlive()方法是Thread类中的一个实例方法,用于判断线程是否处于活动状态。

下面是一个简单的示例,演示了如何使用isAlive()方法来判断线程是否处于活动状态:

public class IsAliveDemo {
    public static void main(String[] args) {
        Thread thread1 = new MyThread("Thread 1");
        Thread thread2 = new MyThread("Thread 2");

        thread1.start();
        thread2.start();

        System.out.println("Thread 1 is alive: " + thread1.isAlive());
        System.out.println("Thread 2 is alive: " + thread2.isAlive());
    }

    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在上面的示例中,我们创建了一个继承自Thread类的MyThread类,并在构造方法中传入线程的名称。在run()方法中,我们让线程休眠2秒钟,模拟一些工作。

在main()方法中,我们创建了两个MyThread对象,并分别给它们指定了不同的名称。然后,我们调用start()方法启动这两个线程。

接着,我们使用isAlive()方法来判断线程是否处于活动状态,并将结果打印出来。

运行该示例,会输出如下结果:

Thread 1 is alive: true
Thread 2 is alive: true

可以看到,尽管我们在main()方法中立即调用了isAlive()方法,但由于线程休眠了2秒钟,所以两个线程仍然处于活动状态,isAlive()方法返回的结果都为true。

通过isAlive()方法,我们可以在需要时判断线程是否处于活动状态,以便进行相应的处理。

10. yield():暂停当前正在执行的线程,并允许其他线程执行。

yield()方法是Thread类中的一个静态方法,用于让出CPU资源,让其他线程有机会执行。

下面是一个简单的示例,演示了如何使用yield()方法来让出CPU资源

public class YieldDemo {
    public static void main(String[] args) {
        Thread thread1 = new MyThread("Thread 1");
        Thread thread2 = new MyThread("Thread 2");

        thread1.start();
        thread2.start();
    }

    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(getName() + ": " + i);
                Thread.yield();
            }
        }
    }
}

在上面的示例中,我们创建了一个继承自Thread类的MyThread类,并在构造方法中传入线程的名称。在run()方法中,我们使用一个简单的循环来输出线程的名称和计数。

在每次循环中,我们调用Thread.yield()方法,让出CPU资源给其他线程。这样,其他线程有机会执行。

运行该示例,会输出如下结果:

Thread 1: 0
Thread 2: 0
Thread 1: 1
Thread 2: 1
Thread 1: 2
Thread 2: 2
Thread 1: 3
Thread 2: 3
Thread 1: 4
Thread 2: 4

可以看到,两个线程轮流输出,通过使用yield()方法,我们可以让线程有机会让出CPU资源,从而实现线程之间的交替执行。

需要注意的是,yield()方法只是一个建议性的方法,它不能保证一定让出CPU资源,具体是否让出由操作系统决定。因此,yield()方法只应该在特定的情况下使用,例如在多个线程执行相同任务时,可以使用yield()方法来平衡线程的执行。

11. setPriority(int priority):设置线程的优先级。

setPriority(int priority)方法是Thread类中的一个方法,用于设置线程的优先级。线程的优先级决定了线程在竞争CPU资源时的相对执行顺序。

下面是一个简单的示例,演示了如何使用setPriority()方法来设置线程的优先级:

public class PriorityDemo {
    public static void main(String[] args) {
        Thread thread1 = new MyThread("Thread 1");
        Thread thread2 = new MyThread("Thread 2");

        thread1.setPriority(Thread.MIN_PRIORITY);
        thread2.setPriority(Thread.MAX_PRIORITY);

        thread1.start();
        thread2.start();
    }

    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(getName() + ": " + i);
            }
        }
    }
}

在上面的示例中,我们创建了一个继承自Thread类的MyThread类,并在构造方法中传入线程的名称。在run()方法中,我们使用一个简单的循环来输出线程的名称和计数。

在main()方法中,我们创建了两个线程对象thread1和thread2,并分别使用setPriority()方法设置它们的优先级。其中,thread1的优先级被设置为最低优先级(Thread.MIN_PRIORITY),而thread2的优先级被设置为最高优先级(Thread.MAX_PRIORITY)。

然后,我们调用start()方法启动线程。

运行该示例,会输出如下结果:

Thread 2: 0
Thread 2: 1
Thread 2: 2
Thread 2: 3
Thread 2: 4
Thread 1: 0
Thread 1: 1
Thread 1: 2
Thread 1: 3
Thread 1: 4

可以看到,由于线程thread2的优先级被设置为最高,它先于线程thread1执行。然后,线程thread1执行。

需要注意的是,线程的优先级只是一个建议性的概念,它不能保证线程的执行顺序。具体的线程调度由操作系统决定。因此,设置线程的优先级应该谨慎,并且只在特定的情况下使用。

12. getPriority():获取线程的优先级。

getPriority()方法是Thread类中的一个方法,用于获取线程的优先级。可以通过调用该方法来获取线程当前的优先级。

下面是一个简单的示例,演示了如何使用getPriority()方法来获取线程的优先级:

public class PriorityDemo {
    public static void main(String[] args) {
        Thread thread1 = new MyThread("Thread 1");
        Thread thread2 = new MyThread("Thread 2");

        thread1.setPriority(Thread.MIN_PRIORITY);
        thread2.setPriority(Thread.MAX_PRIORITY);

        System.out.println(thread1.getName() + " priority: " + thread1.getPriority());
        System.out.println(thread2.getName() + " priority: " + thread2.getPriority());
    }

    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(getName() + ": " + i);
            }
        }
    }
}

在上面的示例中,我们创建了一个继承自Thread类的MyThread类,并在构造方法中传入线程的名称。在run()方法中,我们使用一个简单的循环来输出线程的名称和计数。

在main()方法中,我们创建了两个线程对象thread1和thread2,并分别使用setPriority()方法设置它们的优先级。然后,我们调用getPriority()方法分别获取线程thread1和thread2的优先级,并输出结果。

运行该示例,会输出如下结果:

Thread 1 priority: 1
Thread 2 priority: 10

可以看到,线程thread1的优先级为1,而线程thread2的优先级为10。

需要注意的是,线程的优先级只是一个建议性的概念,具体的线程调度由操作系统决定。因此,获取线程的优先级只是为了了解当前线程的优先级,并不能保证线程的执行顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】红黑树封装map和set

文章目录 一、map和set源码剖析二、红黑树的迭代器1.begin()与end()2.operator()与operator--() 三、set的模拟实现四、map的模拟实现五、完整代码实现1.RBTree.h2.set.h3.map.h5.Test.cpp 一、map和set源码剖析 我们知道&#xff0c;map和set的底层是红黑树&#xff0c;但是我…

如何用Python快速搭建一个文件传输服务

当我的朋友需要把他电脑上面的文件从他的电脑传递到我电脑上的时候&#xff0c;我只需要启动服务 启动服务&#xff01; 他打开web界面 就能把文件传递到我电脑上&#xff08;还能够实时显示进度&#xff09; 文件就已经在我电脑上的uploads文件夹里面了 项目结构如下 templat…

python浮点运算不准确

1.问题 1.12.2的最后结果并不等于3.3 2. 解决方法 错误示范 引入了Decimal计算&#xff0c;但是计算类型是float型&#xff0c;依然计算不准确 正确解决方法 把类型转化为字符串引入计算

动手实战 | 使用 Transformers 包进行概率时间序列预测

最近使用深度学习进行时间序列预测而不是经典方法涌现出诸多创新。本文将为大家演示一个基于 HuggingFace Transformers 包构建的概率时间序列预测的案例。 概率预测 通常&#xff0c;经典方法针对数据集中的每个时间序列单独拟合。然而&#xff0c;当处理大量时间序列时&…

spring中的扩展点解析以及实践使用

文章目录 1、ApplicationContextInitializer2、BeanDefinitionRegistryPostProcessor3、BeanFactoryPostProcessor4、InstantiationAwareBeanPostProcessor5、SmartInstantiationAwareBeanPostProcessor6、BeanFactoryAware7、ApplicationContextAwareProcessor8、BeanNameAwar…

查找文件所在的具体位置

Linux Command 命令: find – walk a file hierarchy (遍历文件层次结构) ;DESCRIPTION 描述: 在指定目录下查找文件和目录, 可以使用不同的选项来过滤和限制查找的结果 ; Grammar Format $ find <在哪个路径下查找> <可选参数…> 常用选项 -name <pattern>…

【javaEE面试题(四)线程不安全的原因】【1. 修改共享数据 2. 操作不是原子性 3. 内存可见性 4. 代码顺序性】

4. 多线程带来的的风险-线程安全 (重点) 4.1 观察线程不安全 static class Counter {public int count 0;void increase() {count;} } public static void main(String[] args) throws InterruptedException {final Counter counter new Counter();Thread t1 new Thread(()…

VMware16.0安装教程和创建

许可证&#xff1a; ZF3R0-FHED2-M80TY-8QYGC-NPKYFYF390-0HF8P-M81RQ-2DXQE-M2UT6ZF71R-DMX85-08DQY-8YMNC-PPHV8设置网络 添加镜像 下载centos7镜像网址https://mirrors.aliyun.com/centos/7/isos/x86_64/?spma2c6h.25603864.0.0.d7724511YPrZpg win10镜像地址https://ww…

Linux+Docker+Gitlab+Jenkins+虚拟内存

最近想研究一下怎么自动化发布项目,于是找到了gitlab+jenkins这个组合,正好借机也研究一下最近很火的docker技术。本篇共分为五部分,分别为安装要求,内存虚拟化,安装docker,安装gitlab,安装jenkins。 一、 安装要求 1 Docker安装要求: 1.1 操作系统 Docker只支持64…

unittest单元测试

java的单元测试框架Junit和TestNG&#xff0c;python里面也有单元测试框架-unittest,相当于是一个python版的junit。python里面的单元测试框架除了unittest,还有一个pytest框架&#xff0c;但是用的比较少 unittest注意点&#xff1a; 导入unittest模块 类名的第一个字母大写&…

代码随想录算法学习心得 40 | 139. 单词拆分、背包问题总结...

一、单词拆分 链接&#xff1a;力扣 描述&#xff1a;给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 思路如下&…

【Linux | Shell】Linux 安全系统 —— 用户、组、文件权限 - 阅读笔记

目录 一、Linux 的安全性1.1 /etc/passwd 文件1.2 /etc/shadow 文件1.3 添加新用户 —— useradd1.4 删除用户 —— userdel1.5 修改用户 —— usermod、passwd、chpasswd 二、使用 Linux 组2.1 /etc/group 文件2.2 创建新组 —— groupadd2.3 修改组 —— groupmod 三、理解文…

Jenkins可持续集成Python自动化脚本

目录 前言 一、Jenkins搭建在Windows上 二、Jenkins搭建在Linux上 &#x1f381;更多干货 完整版文档下载方式&#xff1a; 本文讲解Jenkins如何每次定时的从SVN服务器上拉取最新的代码并执行本地库里的脚本 前言 1、本地代码库目录F:\5i5jautest内有测试文件all_tests.…

Attention,注意力机制

在机器视觉任务中&#xff0c;每一张图片都有重点区域&#xff0c;而非每一个像素对模型理解图片都同等重要。 在自然语言处理任务中&#xff0c;每一段文字都有重点词语&#xff0c;而非每一个字对模型理解语句都同等重要。 如此&#xff0c;在神经网络模型中引入注意力&#…

做投票小程序线上投票制作制作图片投票链接如何做投票小程序

小程序投票活动如何做&#xff1f;很多企业在运营当中&#xff0c;都会通过投票活动来进行推广&#xff0c;从而达到吸粉、增加用户粘度等效果。而此类投票活动&#xff0c;通过小程序就可以实现&#xff0c;操作简单。 我们现在要以“时尚新态度”为主题进行一次投票活动&…

WiFi 时钟+本地温度

[ WiFi 时钟 ] [ WiFi 天气时钟 ] [ WiFi 时钟本地温度 ] 夏天到了&#xff0c;显示器上放一个时钟&#xff0c;顺便实时测量本地室温&#xff0c;看看空调工作是否正常也算是个实用制作。 用到零件共 4 个&#xff1a; 400孔面包板 &#xff08; 大号…

docker配置nacos

1 拉取nacos镜像并启动 docker pull nacos/nacos-server 2 启动nacos命令 docker run -d --name nacos -p 8848:8848 -e PREFER_HOST_MODEhostname -e MODEstandalone nacos/nacos-server 至此&#xff0c;我们已经可以使用nacos服务&#xff0c;UI地址:http://:8848/nacos …

计算机体系结构基础知识介绍之高级分支预测(二)

一、标记混合预测器 分支预测的目的是根据历史信息来预测分支指令的跳转方向和目标地址&#xff0c;从而提高流水线的效率。不同的分支预测方法有不同的优缺点&#xff0c;因此有人提出了一种将多种预测方法结合起来的方案&#xff0c;混合预测器。这种方案可以根据不同的分支…

适合Docker的场景以及不适合的场景

文章来自&#xff1a;When to use and when not to use Docker和7 Cases When You Should Not Use Docker&#xff0c;以及互联网网上的一些零散内容。这篇文章只是基于我自己的理解&#xff0c;进行简单的概述。 适合的场景 你的团队不是一成不变的。 当有新的成员加入&#…

写作技巧:如何让你的文章充满生命力?

在写作中&#xff0c;让文章充满生命力是很重要的一点。如果一篇文章缺乏生命力&#xff0c;那么读者很难被吸引&#xff0c;也很难从中获得任何收获。那么&#xff0c;如何让你的文章充满生命力呢&#xff1f; 以下是几个建议&#xff1a; 1.真实感情&#xff1a;写作的时候要…