“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. 学习Python(一)

    一.Python的基础 1.Python是怎样的语言? 2.Python的安装 Linux安装(python3) yum install -y make zlib zlib-devel gcc-c++ ...

  2. 速看,ElasticSearch如何处理空值

    大家好,我是咔咔 不期速成,日拱一卒 在MySQL中,十分不建议大家给表的默认值设置为Null,这个后期咔咔也会单独出一期文章来说明这个事情. 但你进入一家新公司之前的业务中存在大量的字段默认值为Nu ...

  3. 序列化多表操作、请求与响应、视图组件(子类与拓展类)、继承GenericAPIView类重写接口

    今日内容概要 序列化多表操作 请求与相应 视图组件 内容详细 1.序列化多表操作 模型类 models.py中 # 新建django项目 # 创建表 模型类models.py中: from djang ...

  4. (stm32学习总结)—对寄存器的理解 _

    芯片里面有什么 我们看到的 STM32 芯片是已经封装好的成品,主要由内核和片上外设组成.若与电脑类比,内核与外设就如同电脑上的 CPU 与主板.内存.显卡.硬盘的关系.STM32F103 采用的是 ...

  5. C语言杂谈

    C语言程序处理过程 预处理:宏定义展开.头文件展开.条件编译,这里并不会检查语法 编译:检查语法,将预处理后文件编译生成汇编文件 汇编:将汇编文件生成目标文件(二进制文件) 链接:将目标文件链接为可执 ...

  6. matlab拟合函数的三种方法

    方法一:多项式拟合polyfit 1 x=[1 2 3 4 5 6 7 8 9]; 2 3 y=[9 7 6 3 -1 2 5 7 20]; 4 P= polyfit(x, y, 3) %三阶多项式拟 ...

  7. CSS5:移动端页面(响应式)

    CSS5:移动端页面(响应式) 如果手机端和PC端页面差别很大,就不要写响应式,不要写@media 就直接将两个页面拆开成两个文件就可以了.关于判断是手机端你还是PC端,就交给后端来做只有一些新闻站点 ...

  8. H5活动全屏滚动页面在安卓智能电视TV调试

    前段时间公司做一个线上活动,在电视上商品促销.产品的要求是每个商品介绍刚好满一屏,按下遥控器向下键可以整屏切换.这种功能如果实在PC端,实现起来非常容易,引用jQuery插件就能实现.但是在安卓智能电 ...

  9. Go 里面的 ^ 和 &^

    这几天在研究 Go 的源码,突然发现了一个之前没有见过的位运算,见这里 new &^= mutexWoken & 和 ^,分别表示 AND 和 XOR,这个不用多说. 值得一提的是 ^ ...

  10. java1.7之后的比较器特别之处

    在jdk1.7环境下使用Collectons.sort()方法: 比如:Collections.sort(list, new Comparator<Integer>()); 就可能会出现异 ...