创建线程

  • 创建线程的方式:
    • 继承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. jquery获取关于宽度和高度的尺寸问题

    作者原创,转载请出名出处! console.log("可视区高度:"+$(window).height()); console.log("可视区宽度:"+$(w ...

  2. Linux安全基础:sed命令的使用

    sed 是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作. Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同:同时 ...

  3. SharePoint Permission Extension

    SharePoint Permission Extension 项目很久没维护了,也没有迁移到sp2013上(貌似只要把2013的Form的RenderMode设置为Server后也是可以用的). 在 ...

  4. iOS之9.3真机适配-Could not find Developer Disk Image问题

    Could not find Developer Disk Image 这是由于真机系统过高或者过低,Xcode中没有匹配的配置包文件,我们可以通过这个路径进入配置包的存放目录: /Applicati ...

  5. MDM证书申请的流程

    MDM证书申请的流程 整个流程分为两部分:vendor,customer. 一.Vendor 1.成为一个 MDM Vendor 1) 首先你需要拥有一个 Apple Enterprise accou ...

  6. Xcode计算缓存文件大小和清除缓存

    //获得缓存路径 self.cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, ...

  7. IOS开发之Bug--iOS7View被导航栏遮挡问题的解决

    在实际开发中,遇到在UITextView的frame等于当前控制器的View的frame的情况下,然后运行的时候,发现控制器的Frame的高度y值会从导航条的位置64变化到0. 导致UITextVie ...

  8. xp_sendmail: 由于邮件错误 0x80004005 而失败

    今天收到一封邮件说我们的一台SQL SERVER 2000服务器发送邮件有问题.我测试中发现了如下错误: exec xp_sendmail 'Konglb@esquel.com','hello, 12 ...

  9. Windows下FFmpeg各版本库文件下载

    ffmpeg主要是基于linux开发,当然它也支持windows,不过并不支持visual studio系列IDE(因为它使用了大量C99特性,而vs不支持C99). 要想在windows上使用 一可 ...

  10. java常用的文件读写操作

    现在算算已经做java开发两年了,回过头想想还真是挺不容易的,java的东西是比较复杂但是如果基础功扎实的话能力的提升就很快,这次特别整理了点有关文件操作的常用代码和大家分享 1.文件的读取(普通方式 ...