一、基本概念

线程状态图包括五种状态

1、新建状态(New):线程对象被创建后,就进入新建状态。例如,Thread thread=new Thread();

2、就绪状态(Runnable):也被称为“可执行状态”。线程对象被创建后,其他线程调用了该对象的start()方法,从而来启动该线程。例如thread.start();处于就绪状态的线程,随时可能被CPU调度执行。

3、运行状态(Running):线程获取CPU权限进行执行。注意,线程只能从就绪状态进入到运行状态。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分为三种:

  (1)、等待阻塞:通过调用线程的wait()方法,让线程等待某个工作的完成。

  (2)、同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程所占用),它会进入同步阻塞状态。

  (3)、其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了,或者因异常退出了run()方法,该线程结束生命周期。

二、实现多线程常用的两种方式:Thread和Runnable;【线程池(在java.util.concurrent包中)也可以实现多线程,后面讲解】

1、Thread和Runnable异同

  (1)相同点:都是“多线程的实现方式”。

  (2)不同点:Runnable是接口只包含一个Run()方法;实现方式可以定义一个类A实现该接口,通过new Thread(new A())等方式新建线程。Runnable接口代码如下:        

public interface Runnable {
public abstract void run();
}

     Thread是实现了Runnable接口的一个类。如:public class Thread implements Runnable {}

     我们知道“一个类只能有一个父类,但却能实现多个接口”,因此Runnable具有更好的可扩展性。此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某

   一个Runnable对象建立的,它们会共享Runnable对象上建立的资源。通常建议通过Runnable实现多线程

2、Thread多线程示例

示例代码如下:

import java.util.ArrayList;

public class MyThread extends Thread {
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (this.ticket>0){
System.out.println(this.getName()+"卖票:ticket"+this.ticket--);
}
}
}
} import org.junit.Test; public class ThreadTest {
@Test
public void demo1() {
//启动三个线程,t1,t2,t3;每个线程各卖十张票
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
t1.start();
t2.start();
t3.start();
// t1.run();
// t2.run();
// t3.run();
}
}

Thread示例代码

Thread-1卖票:ticket10
Thread-2卖票:ticket10
Thread-1卖票:ticket9
Thread-0卖票:ticket10
Thread-1卖票:ticket8
Thread-2卖票:ticket9
Thread-1卖票:ticket7
Thread-0卖票:ticket9
Thread-1卖票:ticket6
Thread-2卖票:ticket8
Thread-1卖票:ticket5
Thread-1卖票:ticket4
Thread-0卖票:ticket8
Thread-1卖票:ticket3
Thread-2卖票:ticket7
Thread-1卖票:ticket2
Thread-1卖票:ticket1
Thread-0卖票:ticket7
Thread-0卖票:ticket6
Thread-0卖票:ticket5
ThThread-0卖票:ticket4

运行结果

测试方法属于一个主线程,在里面创建了三个子线程,根据线程内安全,每个线程都会卖出10张票。

3、Runnable多线程示例

示例代码如下:

package RunnableDemo;

public class MyThread implements Runnable {
private int ticket = 10; public void run() {
for (int i = 0; i < 20; i++) {
if (this.ticket > 0) {
System.out.println(Thread.currentThread().getName()+ "卖票:ticket" + this.ticket--);
}
}
}
} package RunnableDemo; import ThreadDemo.ThreadTest;
import org.junit.Test; public class RunnableTest {
@Test
public void demo1() {
MyThread myThread = new MyThread();
//启动三个线程t1,t2,t3(共用一个Runnable对象),这三个线程一共卖10张票
Thread t1 = new Thread(myThread);
Thread t2 = new Thread(myThread);
Thread t3 = new Thread(myThread);
t1.start();
t2.start();
t3.start();
}
}

Runnable示例代码

Thread-1卖票:ticket10
Thread-0卖票:ticket9
Thread-1卖票:ticket8
Thread-2卖票:ticket6
Thread-0卖票:ticket7
Thread-2卖票:ticket4
Thread-1卖票:ticket5
Thread-2卖票:ticket2
Thread-0卖票:ticket3
Thread-1卖票:ticket1

运行结果

主线程创建并启动了三个子线程,而且这三个子线程都是基于“myThread这个Runnable对象”而创建的。运行结果显示这三个线程共同卖出10张票,说明它们共享了Runnable接口。

4、Thread中start()和run()方法区别
(1)、run()方法属于主线程方法,可以当做普通方法使用,在主线程中按照顺序执行,不新开线程,当上一个run()方法体执行完后,下一个run()方法才可以继续,没有达到多线程的目的;

(2)、start()方法来启动线程,真正实现了多线程运行。start()方法启动线程后,线程处于就绪状态,并未运行。然后通过Thread类调用实现Thread类的run()方法,run()方法运行结束标志线程终止。在run()方法执行过程中,其他子线程无需等待某子线程run()方法执行完成,而是由CPU调度执行哪个子线程。start()方法不能被重复调用,否则会抛IllegalThreadStateException异常

也可以通过运行代码,查看当前运行线程名字来判断

package StartVSRun;

public class MyThread extends Thread {
public MyThread(String name) {
super(name);
} @Override
public void run() {
System.out.println(Thread.currentThread().getName()+" is running");
}
} package StartVSRun; import ThreadDemo.ThreadTest;
import org.junit.Test; public class SVSR {
@Test
public void demo1() {
Thread myThread = new MyThread("myThread");
System.out.println(Thread.currentThread().getName() + " call myThread.run()");
myThread.run();
System.out.println(Thread.currentThread().getName() + " call myThread.start()");
myThread.start();
}
}

测试代码

main call myThread.run()
main is running
main call myThread.start()
myThread is running

运行结果

Java多线程基础(一)的更多相关文章

  1. [转]Java多线程干货系列—(一)Java多线程基础

    Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...

  2. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  3. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. Java多线程--基础概念

    Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...

  5. Java多线程基础知识总结

    2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...

  6. Java基础16:Java多线程基础最全总结

    Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...

  7. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  8. Java 多线程基础(一)基本概念

    Java 多线程基础(一)基本概念 一.并发与并行 1.并发:指两个或多个事件在同一个时间段内发生. 2.并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  9. Java 多线程基础(三) start() 和 run()

    Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...

  10. Java 多线程基础(四)线程安全

    Java 多线程基础(四)线程安全 在多线程环境下,如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线 ...

随机推荐

  1. pc加入域认证细节

    计算机组织形式 工作组(无法统一管理,无法统一身份验证) 域 win权限分配机制 管理本地用户 新建用户-加入管理员组. 针对文件夹基于(用户组)设置权限 用户SID 创建一个用户时候,每个用户都有一 ...

  2. C语言 预处理二(宏定义--#define)

    //#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 ...

  3. java实现八皇后问题(递归和循环两种方式)

    循环方式: package EightQueens;   public class EightQueensNotRecursive { private static final boolean AVA ...

  4. 20145222黄亚奇《Java程序设计》第10周学习总结

    20145222 <Java程序设计>第10周学习总结 学习总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接 ...

  5. 安装包制作工具 SetupFactory使用2 API清单

    2014-11-19 SetupFactory中可以通过其API控制很复杂的业务需求. 下图中展示了其内置的API种类与具体分类函数.   序号 API名称 API说明 1 Application.E ...

  6. 7.HBase In Action 第一章-HBase简介(1.2.1 典型的网络搜索问题:Bigtable的起原)

    Search is the act of locating information you care about: for example, searching for pages in a text ...

  7. 【MPI学习2】MPI并行程序设计模式:对等模式 & 主从模式

    这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分: ...

  8. Hadoop的Server及其线程模型分析

    早期的一篇文章,针对Hadoop 2.6.0. 一.Listener Listener线程,当Server处于运行状态时,其负责监听来自客户端的连接,并使用Select模式处理Accept事件. 同时 ...

  9. 人家为撩妹就鼓捣个网页,我做了个约炮APP(已开源)

    每年初夏第一场雷雨刚过,漫步河边的草坪,总是能闻到伴随着泥土的清新,这不是coco的前香,让人神魂颠倒:也不是gucci的后香,让人痴迷如梦.如24节气一样,它提醒人们,夏天到了.昨晚成都下了第一场雷 ...

  10. Android图片浏览器之图片删除

    前一篇介绍了怎么从手机中读取图片文件,放入组件GridView实现网格效果的缩略图显示. 今天研究了对GridView中的子项(各张小图片)进行删除的操作,参考已有软件,长按图片跳出删除确认框. Gr ...