当前位置: 首页 > wzjs >正文

做公开网站的步骤怎么找上海网站建

做公开网站的步骤,怎么找上海网站建,汽车交易网站系统建设,Wordpress djongo创建线程的几种方式 1.Thread1.1.匿名内部类1.2.创建自定义Thread类 2.Runnable2.1.匿名内部类2.2.创建自定义Runnable类2.3.优缺点对比 3.Callable3.1.匿名内部类3.2.自定义Callable类3.3.优缺点对比 4.扩展Thread的run方法和Runnable的方法有什么区别呢? 😀大家好…

创建线程的几种方式

  • 1.Thread
    • 1.1.匿名内部类
    • 1.2.创建自定义Thread类
  • 2.Runnable
    • 2.1.匿名内部类
    • 2.2.创建自定义Runnable类
    • 2.3.优缺点对比
  • 3.Callable
    • 3.1.匿名内部类
    • 3.2.自定义Callable类
    • 3.3.优缺点对比
  • 4.扩展
    • Thread的run方法和Runnable的方法有什么区别呢?

😀大家好!我是向阳🌞,一个想成为优秀全栈开发工程师的有志青年!	
📔今天来说一说创建线程的几种方式。

1.Thread

Thread 创建线程方式:创建自定义线程类,匿名内部类方式

  • start() 方法底层其实是给 CPU 注册当前线程,并且触发 run() 方法执行,start方法相当于修改线程的状态,创建线程将线程状态由 NEW 改为 RUNNABLE(包含就绪态ready运行态running
  • 线程的启动必须调用 start() 方法,如果线程直接调用 run() 方法,相当于变成了普通类的执行,此时主线程将只有执行该线程
  • 建议线程先创建子线程,主线程的任务放在之后,否则主线程(main)永远是先执行完

1.1.匿名内部类

还可以给线程设置对应的名称,当然也可以在创建线程的时候就传递name参数。例如使用这种构造器:public Thread(String name)

public class Test1 {public static void main(String[] args) {Thread t = new Thread() {@Overridepublic void run() {log.debug("running - 1");}};t.setName("t1");t.start();log.debug("running - main");}
}

或者可以这样子写,使用lambda表达式:

public class Test2 {public static void main(String[] args) {Thread t2 = new Thread(() -> log.debug("running - 2"));t2.setName("t1");t2.start();log.debug("running - main");}
}

1.2.创建自定义Thread类

继承 Thread 类的优缺点:

  • 优点:编码简单
  • 缺点:线程类已经继承了 Thread 类无法继承其他类了,功能不能通过继承拓展(单继承的局限性)
public class ThreadDemo {public static void main(String[] args) {Thread t = new MyThread();t.start();for(int i = 0 ; i < 100 ; i++ ){System.out.println("main线程" + i);}// main线程输出放在上面 就变成有先后顺序了,因为是 main 线程驱动的子线程运行}
}
class MyThread extends Thread {@Overridepublic void run() {for(int i = 0 ; i < 100 ; i++ ) {System.out.println("子线程输出:"+i);}}
}

2.Runnable

Runnable 创建线程方式:创建线程类,匿名内部类方式

Thread 的构造器:

  • public Thread(Runnable target)
  • public Thread(Runnable target, String name)

2.1.匿名内部类

public class Test2 {public static void main(String[] args) {Runnable r = new Runnable() {@Overridepublic void run() {log.debug("running");}};new Thread(r, "t2").start();}
}

或者可以这样子写,使用lambda表达式:

public class Test2 {public static void main(String[] args) {// lambda表达式写法Runnable r2 = () -> log.debug("running");new Thread(r2, "t2").start();}
}

2.2.创建自定义Runnable类

public class ThreadDemo {public static void main(String[] args) {Runnable target = new MyRunnable();Thread t1 = new Thread(target,"t1");t1.start();// 没有设置name参数,名称设置为 Thread-0Thread t2 = new Thread(target);}
}public class MyRunnable implements Runnable{@Overridepublic void run() {for(int i = 0 ; i < 10 ; i++ ){System.out.println(Thread.currentThread().getName() + "->" + i);}}
}

2.3.优缺点对比

Runnable 方式的优缺点:

  • 缺点:代码复杂一点。

  • 优点:

    1. 线程任务类只是实现了 Runnable 接口,可以继续继承其他类,避免了单继承的局限性

    2. 同一个线程任务对象可以被包装成多个线程对象

    3. 适合多个多个线程去共享同一个资源

    4. 实现解耦操作,线程任务代码可以被多个线程共享,线程任务代码和线程独立

    5. 线程池可以放入实现 Runnable 或 Callable 线程任务对象

3.Callable

3.1.匿名内部类

重现Callable中的call()方法。

通过 FutureTask.get() 获取返回值(会阻塞直到任务完成)

public class Test3 {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {log.debug("running...");Thread.sleep(2000);return 100;}});new Thread(task, "t1").start();log.debug("{}", task.get());new String();}
}

3.2.自定义Callable类

实现 Callable 接口:

  1. 定义一个线程任务类实现 Callable 接口,申明线程执行的结果类型
  2. 重写线程任务类的 call 方法,这个方法可以直接返回执行的结果
  3. 创建一个 Callable 的线程任务对象
  4. 把 Callable 的线程任务对象包装成一个未来任务对象
  5. 把未来任务对象包装成线程对象
  6. 调用线程的 start() 方法启动线程
public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return Thread.currentThread().getName() + ":" + "Hello";}
}
public class ThreadDemo {public static void main(String[] args) {Callable callable = new MyCallable();FutureTask futureTask = new FutureTask(callable);Thread thread = new Thread(futureTask);thread.start();try {System.out.println(futureTask.get());} catch (Exception e) {e.printStackTrace();}}
}

3.3.优缺点对比

优缺点:

  • 优点:同 Runnable,并且能得到线程执行的结果
  • 缺点:编码复杂

4.扩展

Thread的run方法和Runnable的方法有什么区别呢?

Thread 类本身也是实现了 Runnable 接口,Thread 类中持有 Runnable 的属性,执行线程 run 方法底层是调用 Runnable的run方法:

public class Thread implements Runnable {private Runnable target;public void run() {if (target != null) {// 底层调用的是 Runnable 的 run 方法target.run();}}
}

请添加图片描述

——👦[作者]:向阳256
——⏳[更新]:2025.5.5
——🥰本人技术有限,如果有不对指正需要更改或者有更好的方法,欢迎到评论区留言。
http://www.dtcms.com/wzjs/549151.html

相关文章:

  • 网站买流量是怎么做的外贸网站seo推广教程
  • 制作网站的公司电话号码手机网站有什么区别吗
  • 网站域名到期如何续费湖州住房和城乡建设局网站
  • 网站添加标签云广州网站建设网站定制
  • 鄂州市住房和城乡建设部网站h5个人网站源码
  • 成品网站模块公众号开发者密码怎么获得
  • 欢迎访问中国建设银行网站个人客户6深圳影视广告制作预算
  • 怎么建设自己产品网站杭州公司官方网站制作
  • 怎么在建筑网站做翻译兼职sem和seo的区别
  • 西南交通建设集团网站企业的网站建设与设计论文
  • wp网站模板帝国转wordpress
  • 二级域名做很多网站受雇去建设网站类网站
  • 装修公司网站怎么做的手机网站建设公司
  • 餐饮企业网站设计网站服务器建设的三种方法
  • 北京网站seo技术厂家正规网站建设加盟合作
  • 盐城市建设局网站设计备案资料免费网站建站塔山双喜
  • win7本地做网站江宁住房和城乡建设局网站
  • 做网站的公司排行网站模板欣赏
  • 溧阳建设局网站6网络营销的推广方式
  • 网站备案安全承诺书摄影师招聘网站
  • 用vs做网站的登录wordpress ajax顶踩
  • 星乐seo网站关键词排名优化烟台百度网站
  • 怎么检查网站有没有被挂马美工培训班哪家好
  • seo优化网站推广ui设计发展前景及未来
  • 设计网站作品设计网站推荐ps
  • 网络网站开发模板建站广团
  • 思睿鸿途北京网站建设长沙做网站费用
  • 网站流量数据分析东莞人力资源招聘官网
  • 微网站怎么做百度关键词排名最新军事报道 新闻事件
  • 24小时学会网站建设pdf深圳拼团手机网站开发