一、进程,线程,并发,并行
1.1 进程和线程的区别
      进程是指:一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
        线程是指,进程里的一个执行流程,一个进程可以包含多个线程。比如一个java.exe(进程)可以运行多个线程,线程总是属于某个进程,多个线程之间共享进程的内存。
        多线程:指的是这个程序(一个进程)运行时产生了不止一个线程
 
1.2并发和并行的区别:
     并发,是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序:

     并行,是每个cpu运行一个程序:

      

二、线程的周期和五种状态
 
线程的生命周期 :

 
2.1新建状态(new):当线程被创建后,处于新建状态,如 Thread t1 = new MyThread();
2.2就绪状态(Runnable):当调用线程的star()方法时,进入就绪状态。处于就绪状态表示,线程已经准备好,随时等候cpu调用。
2.3运行状态(Running):当cpu开始调度处于就绪状态的线程时,线程才得以执行,进入运行状态。就绪状态是线程进行到运行状态的唯一途径。
2.4阻塞状态(Blocked):处于运行时状态的线程出于某些原因暂时放弃对cpu的使用权,暂停被执行,此时进入阻塞状态,知道阻塞状态变回就绪状态,才有机会被cpu调度重新进入运行状态。根据阻塞的原因的不同,可以分为3种不同的阻塞状态:
a. 等待阻塞:运行中的线程执行wait()方法进入到阻塞状态;
b. 锁定阻塞:线程在获取同步锁失败时(因为同步锁被其他线程占用),它会进入到锁定阻塞状态;
c. 其他阻塞 : 通过调用线程的sleep(),join(),或者发出I/O请求时,线程会进入到阻塞状态。当线程调用 sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
2.5.死亡状态(Dead):当线程正常结束或者异常退出时,线程进入死亡状态。线程的生命周期结束。
 
 

 
 
三、多线程的创建和启动(第一第二中比较常用)
3.1 继承Thread类,重写该类的run()方法。
 MyThread.java

 /**
* 实现Thread类并重写run方法
* @author luke
*
*/
public class MyThread extends Thread {
private int i = 0; @Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "," + i);
}
}
}

Client.java测试类

 package com.asiainfo.test.thread;

 /**
* 测试类
* @author hasee
*
*/
public class Client {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if(i == 30) {
Thread myThread1 = new MyThread();//创建一个新的线程,这时的状态为new
Thread myThread2 = new MyThread();//创建一个新的线程,这时的状态为new
myThread1.start();
myThread2.start();
}
}
}
}
3.2 实现Runnable接口,并重写该接口的run()方法
MyRunnalbe.java
 package com.asiainfo.test.thread2;

 /**
* 多线程,通过实现Runnable接口,重写run方法
* @author hasee
*
*/
public class MyRunnalbe implements Runnable {
private int i = 0; /**
* 线程执行体,描述线程需要完成的任务。
*/
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "," + i);
}
} }

RunnableTest.java测试类

 package com.asiainfo.test.thread2;

 /**
* 测试类
* @author hasee
*
*/
public class RunnableTest {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "," + i);
if(i == 30) {
MyRunnalbe runnable = new MyRunnalbe();//创建一个runnable的实现类
Thread t1 = new Thread(runnable);//将runnable作为入参Thread 入参target创建新的线程
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
}
}
}
}
3.3 使用Callable和Future接口创建线程
 

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. python3-file文件操作

    # Auther: Aaron Fan '''打开文件的模式有三种:r,只读模式(默认).w,只写模式.[不可读:不存在则创建:存在则删除内容:因为会清空原有文件的内容,一定要慎用]a,追加模式.[可 ...

  2. Entity Framework Tutorial Basics(14):Choose development approach

    Choose development approach with Entity Framework: We have seen Code-first, Model-first and Database ...

  3. Python--详解TKinter类库

    为了学习python3.5的tkinter,于是我去官网找了找相关部件的一些文档,读起来有点绕口,觉得还是自己来实践实践,看看视频感觉用处会更大,然后就有了下面的一部分常用的总结, 查看tkinter ...

  4. 找BUG

    找一找BUG 一段代码,实现一个pop,push,和getmin都是O(1)的方法. 最初源代码 伙伴代码如下,代码的地址可以通过这个访问: Ubuntu Pastebin https://paste ...

  5. jQuery 插件开发——PopupLayer(弹出层)

    导读:上次写了一篇关于GridView的插件开发方法,上几天由于工作需要,花了一天左右的事件封装了popupLayer(弹出层)插件.今天有时间就记录一下自己的开发思想与大家分享下,同时也算是对这段时 ...

  6. Vue属性绑定

    v-bind:属性动态绑定数据,简写: v-html:绑定html代码 {{}}:绑定数据,另一种v-text v-bind:class="{‘red’:isActive}"  : ...

  7. 混合APP开发-hybrid 升级流程

    本文来自网易云社区 作者:王贝 目前大多数APP已经应用hybrid进混合开发,这不,我们的gacha APP这个版本已经开始使用hybrid来开发了,hybrid的优势这里就不多说了,这里主要讲一下 ...

  8. MariaDB之SQL语句基础

    数据库组件: 数据库:database 表: table 索引:index 视图:view 用户:user 权限:privileges 存储过程:procedure 存储函数:function 触发器 ...

  9. History命令用法15例

    以下内容为转载: 如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTT ...

  10. git 本地分支与远程分支相关操作记录

    1.远程分支中有新增分支,但自己的本地分支没有对应同步 git checkout -b [remote-branch-name] origin/[remote-branch-name] 2. 查看本地 ...