首页 > 其他分享 >创建与启动线程之二(继承Thread类)(实现Runnable接口)

创建与启动线程之二(继承Thread类)(实现Runnable接口)

时间:2024-03-27 13:32:55浏览次数:26  
标签:Runnable run Thread 对象 start 线程 public

1.概述

java的JVM允许程序运行多个线程.使用java.lang.Thread来表示线程.一个线程都直接或间接的继承于Thread类,即每个线程的对象要么是Thread的实例,要么是其子类的实例.

2.Thread类的特性

  • 每个线程都是通过某个特定的Thread对象的run方法来完成操作的,run()被称为线程执行体.
  • 通过该线程对象的start()方法启动该线程,而非直接调用run方法(直接调用run()).
  • 调用start()有两方面作用 : 启动该线程,调用run()方法.
  • 要想实现多线程,则需要在主线程上创建新的线程对象.

3.方式1 : 继承Thread类

(1). 设计一个类并继承于Thread类.

(2). 重写Thread类的run()方法.

(3). 在主线程创建该子类的对象.

(4). 该对象调用start()启动线程.

例子 : 

public class MulThread {
    public static void main(String[] args) {
        A a = new A();
        a.start();
        for (int i = 0; i <= 100 ; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
        }

    }
}

class A extends Thread{
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i % 2 == 1) {
                System.out.println(Thread.currentThread().getName() + "\t" +  i);
            }
        }
    }
}

控制台 : 
Thread-0	1
main	0
main	2
Thread-0	3
main	4
Thread-0	5
main	6
Thread-0	7
main	8
Thread-0	9
main	10
略

4.放式2 : 实现Runnable接口

正儿八经的写法

(1). 创建一个实现Runnable接口的实现类.

(2). 实现接口的run()方法,线程要执行的操作,在该方法体中.

(3). 创建这个实现类的对象.

(4). 将该对象作为参数传递到Thread类的构造器,创建Thread类的对象.

(5). 通过Thread类的对象调用start()方法,启动线程,运行当前线程的run()方法.

例子 : 

public class RunnableTest {
    public static void main(String[] args) {
        //创建匿名实现类的匿名对象
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 100; i++) {
                    if (i % 2 == 0) {
                        System.out.println(Thread.currentThread().getName() + "\t" + i);
                    }
                }
            }
        }).start();
        for (int i = 0; i <= 100; i++) {
            if (i % 2 == 1){
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }

        }
    }
}

控制台 : 
Thread-0	0
main	1
Thread-0	2
main	3
Thread-0	4
main	5
Thread-0	6
main	7
Thread-0	8
main	9
Thread-0	10
main	11
略

标签:Runnable,run,Thread,对象,start,线程,public
From: https://blog.csdn.net/2301_80912559/article/details/137069425

相关文章

  • java声明不同线程池
    声明一个静态线程池publicstaticfinalExecutorServicePOOL;privatestaticThreadFactorynamedThreadFactory=newThreadFactoryBuilder().setNameFormat("COMMON-POOL-%d").build();static{POOL=newThreadPoolExecutor(20,40,300,......
  • spring+struts 配置和管理线程池
    <!--定义线程池--><beanid="taskExecutor"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><propertyname="corePoolSize"value="5"/><propertyname="maxPoolSi......
  • linux 线程的一些简答概念
    基本概念1.临界资源:多线程执行流共享的资源2.临界区:访问临界资源的代码3.原子性:只有完成和未完成两种状态。4.互斥:同一时间只能允许一个线程访问临界资源,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。可以加锁实现。加锁可以保证单个线程对临界......
  • Java中创建线程的多种方式实例
    在Java中创建线程的方式有多种,以下是几种常见的创建线程的方式,选择哪种方式取决于具体的需求和设计。需要注意的是,在使用多线程时,要确保线程安全,避免出现并发问题。1、普通Thread创建//继承创建线程staticclassNewThreadextendsThread{@Override......
  • 【SpringBoot3+Mybatis】小程序和后台管理系统 员工/分类/菜品/套餐管理 上传文件 CRU
    文章目录一、项目介绍&Github二、技术选型三、开发环境搭建四、员工管理4.1新增员工①sql②对象拷贝DTO与Entity③异常捕获与处理④动态获取当前登录者Id⑤ThreadLocal4.2员工分页查询①请求参数实体与响应数据实体②controller层③service层使用pageHelper......
  • 异步VS多线程
    前段时间面试的时候被问到了异步和多线程的区别,回答的模棱两可,今天花时间系统的了解了下,如有错误,欢迎斧正~异步与多线程是在并发编程中两个比较关键的概念, 很容易弄混淆:异步编程(Asynchronous)概念:异步编程是并发编程的一种形式,即在程序运行逻辑中,一部分语句可以独立于主程序而......
  • C# 线程相关一点杂记
    相信很多人在实际开发中是不愿使用到多线程的,因为一旦引入多线程这个概念,对应功能就需要加很多关于线程的考虑措施,如锁,任务回调顺序等等。有事加了一些对应的措施,还是感觉程序出现偶发的不同问题,这里主要记录一下多线程任务时需要注意的一些毫秒相关的事情。for(inti=0......
  • 线程池的创建方式、七个参数、拒绝策略、阻塞队列、线程池大小设定
    线程池的创建方式1、通过Executors的静态方法可以创建四种类型的线程池。(不推荐)1)FixedThreadPool创建一个固定线程数的线程池,线程数量一直保持固定不变,如果任务提交时,没有空闲线程,那就进入任务队列,当有空闲时间时,再执行任务队列中的任务。2)SingleThreadExecutor线程池中......
  • Java面试必问题18:线程安全的集合类和有序的集合类
         精华篇:  极致精简解释有序的集合类包括:TreeMap-基于红黑树实现的有序Map。LinkedHashMap-基于哈希表和双向链表实现的有序Map。TreeSet-基于红黑树实现的有序Set。LinkedHashSet-基于哈希表和双向链表实现的有序Set。示例:有序Map:TreeMap有序Li......
  • 多任务之进程与线程
    多任务进程与线程一、多任务介绍​ 我们生活中有很多事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;用程序来模拟:fromtimeimportsleepdefsing():foriinrange(3):print("正在唱歌...%d"%i)sleep(1)defda......