“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. 什么是 spring?

    Spring 是个 java 企业级应用的开源开发框架.Spring 主要用来开发 Java 应用, 但是有些扩展是针对构建 J2EE 平台的 web 应用.Spring 框架目标是简化 Java 企 ...

  2. Python中对象、类型、元类之间的关系

    Python里的对象.类型和元类的关系很微妙也很有意思. 1989年圣诞节期间,上帝很无聊,于是创造了一个世界. 对象 在这个世界的运转有几条定律. 1.一切都是对象 对象(object)是这个世界的 ...

  3. PCB布线总的原则

    转自张飞实战电子公众号 PCB布线总的原则 最短路径和减少干扰 PCB布线的总的流程大致如下: 1了解制造厂商的制造规范-线宽,线间距,过孔要求及层数要求: 2确定层数并定义各层的功能: 3设计布线规 ...

  4. EMC EMI EMS定义与区别

    一.EMC EMI EMS定义: EMC(ElectromagneticCompatibility) 电磁兼容,是指设备或系统在电磁环境中性能不降级的状态.电磁兼容,一方面要求系统内没有严重的干扰源, ...

  5. React 可视化开发工具 Shadow Widget 非正经入门(之六:markdown)

    本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇讲解 Markdown 在 Shadow Widget 中的应用. Markdown 在 Shadow Widget 中 ...

  6. APK安装流程概述

    pre { background: none left top repeat scroll rgba(0, 0, 0, 0); border: 1px solid rgba(0, 0, 0, 1); ...

  7. Zookeeper中的Leader选取机制

    一.Zookeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应 ...

  8. Oracle中between 和 in

    select * from test_s where id between 2 and 12; between 就是左右全闭区间. SELECT columnsFROM tablesWHERE col ...

  9. Ubuntu安装开发者平台Backstage

    Ubuntu安装开发者平台Backstage 什么是Backstage? Backstage是一个构建开发者门户的开源平台.通过支持一个集中的软件分类,Backstage可以保存并发布你的微服务和基础 ...

  10. MySQL 中继日志

    什么是中继日志从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件即relay-log日志中,然后从服务器SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器 ...