创建线程

  • 创建线程的方式:
    • 继承java.lang.Thread
    • 实现java.lang.Runnable接口
  • 所有的线程对象都是Thead及其子类的实例
  • 每个线程完成一定的任务,其实就是一段顺序执行的代码

继承java.lang.Thread创建线程

public class Test1  {
public static void main(String[] args){
System.out.println("现在是主线程: "+Thread.currentThread());
//用静态方法获取当前正在执行的线程
System.out.println("下面新建两个线程");
new Test(100).start();
new Test(100).start();
//这里开启两个线程,但不是完成同一件任务
}
}
class Test extends Thread{
//继承Thread类
private int tickets;
Test (int tick){
tickets=tick;
}
public void run(){
for (;tickets>0;tickets--) {
System.out.println("当前线程:"+getName()+" 卖出第 "+tickets+" 张票。");
//用this获得当前线程
if (tickets==1){
System.out.println("票已卖完,当前线程是: "+getName());
}
}
}
}

0036 Java学习笔记-多线程-创建线程的三种方式

 

创建线程

  • 创建线程的三种方式:

    • 继承java.lang.Thread
    • 实现java.lang.Runnable接口
    • 实现java.util.concurrent.Callable接口
  • 所有的线程对象都是Thead及其子类的实例
  • 每个线程完成一定的任务,其实就是一段顺序执行的代码

继承java.lang.Thread创建线程

package testpack;

public class Test1  {
public static void main(String[] args){
System.out.println("现在是主线程: "+Thread.currentThread()); //用静态方法获取当前正在执行的线程
System.out.println("下面新建两个线程");
new A(100).start();
new A(100).start(); //这里开启两个线程,但不是完成同一件任务
}
}
class A extends Thread{ //继承Thread类
private int tickets;
A (int tick){
tickets=tick;
}
public void run(){
for (;tickets>0;tickets--) {
System.out.println("当前线程:"+getName()+" 卖出第 "+tickets+" 张票。"); //用this获得当前线程
if (tickets==1){
System.out.println("票已卖完,当前线程是: "+getName());
}
}
}
}
  • 继承Thread类,开启线程的步骤:

    • 定义一个类,继承Thread,重写run()方法,run()方法就是线程要完成的任务
    • 创建该类的实例,并调用start()方法启动线程
  • 继承Thread类开启的线程,各自完成各自的任务

实现java.lang.Runnable接口创建线程

public class Test1  {
public static void main(String[] args){
System.out.println("现在是主线程: "+Thread.currentThread());
System.out.println("下面新建两个线程");
Test test=new Test(100);
//创建一个任务的对象
new Thread(test,"线程A").start();
//以同一个任务对象为target,开启两个线程
new Thread(test,"线程B").start();
//两个线程完成同一项任务,但是二者协作沟通不好
}
}
class Test implements Runnable{
//实现Runnable接口
private int tickets;
Test (int tick){
tickets=tick;
}
public void run(){
//同样重写run()方法,就是线程要完成的任务
for (;tickets>0;tickets--) {
System.out.println("当前线程:"+Thread.currentThread()+" 卖出第 "+tickets+" 张票。");
if (tickets==1){
System.out.println("票已卖完,当前线程是: "+Thread.currentThread());
}
}
}
}
  • 实现Runnable接口开启线程的步骤:

    • 定义一个类,实现Runnbale接口,重写run()方法
    • 创建该类的对象,即任务对象
    • 以任务对象为target,创建线程,调用start()方法
  • 通过Runnable接口创建的多个线程,可以写作完成同一件任务,只是协作方面有待改进

Thread、Runnable的比较

  • Thread:

    • 不能继承其他类;
    • 用this获取当前线程
    • 多个线程不能执行同一个target任务
  • Runnable:
    • 可以继承其他类;
    • 用Thread.currentThread()获取当前线程
    • 多个线程可以执行同一个target任务

线程的生命周期

  • 新建(New):

    • 创建线程对象后,就处于“新建”状态,此时跟一个普通的对象无异
    • 只能对新建状态的线程对象,调用start()方法
  • 就绪(Runnable):
    • 调用start()方法后,处于就绪状态,虚拟机为其创建方法调用栈和程序计数器
    • 何时开始运行,取决于JVM的调度
    • 就绪状态可能从“新建”、“阻塞”、“运行”三种状态变化而来
  • 运行(Running):
    • 线程获得了在CPU上运行的权利,开始运行
    • 何时中断执行,也取决于调度,一个线程不可能一直占着cpu
    • 一个线程,可以调用sleep()或者yield()方法,来主动放弃执行权利
  • 阻塞(Blocked):
    • 调用sleep()方法
    • 调用了一个阻塞式的IO方法,该方法返回之前,被阻塞
    • 试图获得一个同步监视器,但该监视器被其他线程所持有
    • 等待其他线程的notify()通知
    • 调用suspend()方法将该线程挂起。尽量避免该种方法,可能导致死锁
  • 死亡(dead):
    • 线程任务执行完成
    • 线程抛出未捕获的异常或错误
    • 调用线程的stop()方法
    • 主线程运行结束,不影响子线程的继续运行
    • boolean isAlive()方法返回线程是否已死亡:处于新建和死亡两种状态返回false,其他三种状态返回true

start()与run()方法

    • 永远不要调用线程对象的run()方法。直接调用run()方法的话,那么就只是一个普通方法,而不是线程任务
    • 调用了run()方法之后,会改变线程对象的状态,不再是新建状态,因而也就不能调用start()方法
    • 只能对处于新建状态的线程对象调用start()方法,且只能调用一次,否则抛出IllegalThreadStateException异常

Java学习笔记-多线程-创建线程的方式的更多相关文章

  1. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  2. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  3. java学习笔记 --- 多线程(线程安全问题——同步代码块)

    1.导致出现安全问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 2.解决线程安全问题方法: 同步代码块: synchronized(对象){ 需要同步的代码; ...

  4. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  5. java学习笔记 --- 多线程(多线程的创建方式)

    1.创建多线程方式1——继承Thread类. 步骤:  A:自定义类MyThread继承Thread类.  B:MyThread类里面重写run()? 为什么是run()方法呢? C:创建对象 D:启 ...

  6. 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal

    什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...

  7. JAVA学习笔记16——控制线程

    Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程执行.   join线程 Thread提供了让一个线程等待另一个线程完成的方法——join().当在某个线程执行流中 ...

  8. 0039 Java学习笔记-多线程-线程控制、线程组

    join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...

  9. 0040 Java学习笔记-多线程-线程run()方法中的异常

    run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...

随机推荐

  1. iOS 字号转换问题

    一,ps和pt转换 px:相对长度单位.像素(Pixel).(PS字体) pt:绝对长度单位.点(Point).(iOS字体) 公式如下: pt=(px/96)*72. 二,字体间转换 1in = 2 ...

  2. Linux学习心得之 Linux下ant安装与使用

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下ant安装与使用 1. 前言2. ant安装3. 简单的a ...

  3. android FrameLayout详解

    首先看演示: FrameLayout框架布局是最简单的布局形式.所有添加到这个布局中的视图都以层叠的方式显示.第一个添加的控件被放在最底层,最后一个添加到框架布局中的视图显示在最顶层,上一层的控件会覆 ...

  4. 每个程序员都会的 35 个 jQuery 小技巧

    1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...

  5. React Native之FlexBox介绍和使用

    # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...

  6. ios textfield / textview长按复制粘贴中文显示

    当我们在写应用时要复制粘贴文本框内容时,默认显示的文字为英文字体,可按如下步骤设置,显示中文:

  7. 支付宝alipay使用小结 调用支付宝程序被杀死说明

    一. 准备阶段 如果没有蚂蚁金服开放平台的注册账号,则需要实现注册一个,这里多说一点,就是当我们以公司名义注册账号时,需要预备公司的营业执照等物品(需要上传照片等信息审核).账号申请成功之后,我们需要 ...

  8. Android自定义控件(二)

    这一篇主要来讲一下自定义控件中的自定义viewgroup,我们以项目中最常用的下拉刷新和加载更多组件为例 简单介绍一下自定义viewgroup时应该怎么做. 分析:下拉刷新和加载更多的原理和步骤 自定 ...

  9. 设置Hyper V

    1.打开服务器管理器 2.添加角色和功能 3.安装类型 -> 基于角色或基于功能的安装 4.服务器选择 -> 下一步 5.服务器角色 勾选"Hyper V"

  10. Linux配置环境报“/usr/local/develop-tools/apache-maven-3.3.9/bin: 是一个目录“的解决方案

    安装Maven中 配置系统环境变量: # vi + profile M2_HOME=/usr/local/develop-tools/apache-maven- export M2_HOME PATH ...