“java多线程的实现——几乎都要和java.lang.Thread打交道”

方式一:继承于Thread类

1、创建一个继承于Thread类的子类

2、重写Thread类的run()

3、创建Thread类的子类对象

4、通过此对象调用start():1启动当前线程 2调用当前线程的run()

例子:遍历100以内的所有偶数
class MyThread extends Thread{  //继承Thread类
//重写run方法
@Override
public void run() {
for(int i=0;i<100;i++)
{
if(i%2==0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
} public class ThreadTest {
public static void main(String[] args) {
//方式一
MyThread t1=new MyThread();
t1.start(); //start():1启动一个线程 2执行run() for(int i=0;i<100;i++) //主线程
if(i%2==1)
System.out.println(Thread.currentThread().getName()+":"+i); // //方式二
// MyRunnable r1=new MyRunnable();
// new Thread(r1).start();
}
}

ps:

如果main中直接调用t1.run,并不会有新线程,仍然是main的原线程调用了run方法而已

如果线程已经start,不能再进行start(可从代码中发现会报异常)

Thread类中的常用方法

  • 构造器可以设置线程名
  • start():启动当前线程;调用当前线程的run()
  • run(): 线程所做的事务,实现多线程通常重写此方法
  • Thread.currentThread():静态方法,返回执行当前代码的线程对象
  • setName():设置线程名
  • getName():返回线程名
  • yield():释放当前执行线程对cpu的执行权(但下次cpu调度仍然可能是ta)
  • join():在线程a中调用线程b的join(),此时a进入阻塞直到b执行完后才唤醒a
  • Thread.sleep(m):当前执行进程进入睡眠m毫秒

    (当前线程进入阻塞态并释放cpu,但不会释放锁,所以一段时间内会无任何线程运行。睡眠结束后被阻塞的进程进入就绪状态——也就是仍然要与其他线程抢夺cpu)
  • isLive():判断线程是否仍然存活

Thread类中的优先级

  • MAX_PRIORITY:10

    MIN_PRIORITY:1

    NORM_PRIORITY:5 -->默认优先级
  • 如何获取和设置当前线程的优先级:

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

    setPriority():设置线程的优先级

    -PS:高优先级的线程只是更大概率抢占低优先级线程的cpu执行权,不一定百分百。







方式二:创捷一个实现Runnable接口的类并创建其对象

该对象传入Thread的构造器当中

这里可以理解成实现一个Runnable事务类,并创建事务对象传入不同线程对象(同一事务不同线程)

1、创建一个实现了Runnable接口的类

2、实现类去实现Runnable中的抽象方法:run()

3、创建实现类的对象

4、将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象

5、通过Thread类的对象调用start()

      MyRunnable r1=new MyRunnable();
new Thread(r1).start();



案例实现:创建三个窗口卖票,总票数为100张

  1. 使用Thread方式(需要在MyThread类中设置静态变量来表示票数)
  2. 实现Runnable接口的实现类(只有一个实现类的对象,在对象中设置表示票数的变量即可)



开发中更适合用实现接口(第二种方式),没有单继承局限性同时也更适合共享数据的情况

传统多线程实现方式为两种,但最新jdk支持另外两种方式

守护线程和用户线程

Java多线程——实现的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. Dubbo Monitor 实现原理?

    Consumer 端在发起调用之前会先走 filter 链:provider 端在接收到请求时也是 先走 filter 链,然后才进行真正的业务逻辑处理. 默认情况下,在 consumer 和 pro ...

  2. ZAB 和 Paxos 算法的联系与区别?

    相同点: 1.两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行 2.Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提 ...

  3. Netty学习摘记 —— UDP广播事件

    本文参考 本篇文章是对<Netty In Action>一书第十三章"使用UDP广播事件"的学习摘记,主要内容为广播应用程序的开发 消息POJO 我们将日志信息封装成名 ...

  4. 更改IE中的jdk版本

    一丶打开IE设置: 快捷键:Ctrl+Shift+Alt+S 二丶在设置中调设已经安装的jdk版本(前提已安装):

  5. c源文件中为什么要包含自己对应的头文件

    另一篇:.c文件和.h文件的关系 引言: 我们经常在c工程中发现,源文件中要包含自己的头文件.一直以来,都不知道为什么这样做.现在,我知道了. 以前的认知: 我认为,.c文件没有必要包含自己的.h文件 ...

  6. 如何做好移动端的响应式设计:Viewport控制

    新人翻译,欢迎转载~ 英文原文地址:http://bitsofco.de/2015/respove-design-viewport/ 原文例程地址:https://github.com/ireade/ ...

  7. H5优化:canonical标签该如何正确使用

    对一组内容完全相同或高度相似的网页,通过使用Canonical标签可以告诉搜索引擎哪个页面为规范的网页,能够规范网址并避免搜索结果中出现多个内容相同或相似的页面,帮助解决重复内容的收录问题,避免网站相 ...

  8. 移动端页面中点击input输入框的时候弹出的键盘将输入框挡住的问题

    使用的是vux框架, 以为是框架问题, 后来发现是把当前页面的高度写死为了height:200%: 只要把高度去掉就能让页面自动弹到输入框的上方:

  9. MAUI VS Preview 2.1 win 下无法调试ios, 目前无解

    Microsoft Visual Studio Community 2022 (64 位) - Preview 版本 17.2.0 Preview 2.1 报错 严重性 代码 说明 项目 文件 行 禁 ...

  10. 深度理解springboot集成cache缓存之源码解析

    一.案例准备 1.创建数据表(employee表) 2.创建Employee实体类封装数据库中的数据 @AllArgsConstructor @NoArgsConstructor @Data @ToS ...