创建线程

  • 创建线程的方式:
    • 继承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. HTML5学习笔记三 HTML元素、属性、标题、段落简介

    一.HTML 元素 HTML 元素以开始标签起始 HTML 元素以结束标签终止 元素的内容是开始标签与结束标签之间的内容 某些 HTML 元素具有空内容(empty content) 空元素在开始标签 ...

  2. 深入剖析通知中心和KVO

    深入剖析通知中心和KVO 要先了解KVO和通知中心,就得先说说观察者模式,那么观察者模式到底是什么呢?下面来详细介绍什么是观察者模式. 观察者模式 -A对B的变化感兴趣,就注册成为B的观察者,当B发生 ...

  3. 【Lucene】三个高亮显示模块的简单示例-Highlighter

    Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter 这里的三个示例都是使用Highlighter: 示例代码: package c ...

  4. 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

    执行以下代码,生成唯一的UID $fp = popen("/xxx/bin/tools/uuidgen system", "r");// $uid = frea ...

  5. [C#6] 2-nameof 运算符

    0. 目录 C#6 新增特性目录 1. 老版本的代码 using System; namespace csharp6 { internal class Program { private static ...

  6. 使用PhoneGap开启移动开发之旅

    移动市场风起云涌,只是好像和悲催的.net程序员隔绝.我们内心中一直期待的Windows Phone终究不能匹及windows, 随着时间的流逝,windows phone越来越像扶不起的阿斗,连微软 ...

  7. js获取浏览器内核、类型、版本以及系统类型

    正则表达式: var rsys = /\b(windows|win32|macintosh|mac os x|adobeair|linux|unix)\b/; var rkn = /\b(opera| ...

  8. docker-8 docker小技巧

    docker使用小技巧 杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有的已经停止的容器 docker rm $(docker ps -a -q) 删除所 ...

  9. Log4J基础详解及示例大全

    去年这个时候,为做软件工程的大作业就详细学过Log4J的用法了,时隔一年想要在新的项目中好好使用一下的时候,发现几乎全忘了,悲催啊-- 再上网查资料,总是不能找到一篇符合我的口味,拿来就能轻松上手,方 ...

  10. 如何正确的使用json?如何在.Net中使用json?

    什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...