先举个例子

计算机的核心是CPU,它承担了计算机所有计算任务,可以把它理解为像一个工厂,时刻在运行。

假定工厂有一个电力系统,工厂有很多车间,一次只能供给一个车间使用,也就是说一个车间开工的时候,其他车间必须停工。背后的含义就是单个CPU一次只能运行一个任务,所以现在的计算机都是多核的。

进程就好比工厂的车间,它代表CPU所能处理的单个任务。任何一个时刻,CPU总是运行一个进程,其他进程处于非运行状态(这是针对单核来说的)

在 一个车间里,可以有很对工人,他们协同完成一个任务,线程就好比车间里的工人,一个(车间)进程可以包含多个(工人)线程。

从而得出:

进程:系统进行程序的基本单位,有独立的内存空间和系统资源(简单的可以理解为一个软件的运行,如一个qq的运行就是一个进程)

线程:进程中执行运算的最小单位,处理机分配给线程,即真正在处理机上运行的是线程。

线程的实现

两种方式:

-->继承Thread类 (extends),重写run()方法,调用start()启动线程

-->实现runnable接口(implements),重写run()方法,调用start()启动线程

线程的命名

一般在线程启动前去命名,不建议启动后在修改,也不建议对不同的线程取相同的名字

两种命名方式:系统默认命名和自定义名称

class MyThread extends Thread{

    public void run(){
for (int i = 0; i <=5; i++) {
//获得当前线程的名字
        //得到的结果为如:Thread-0、Thread-1 默认的线程名称从0开始
System.out.println(Thread.currentThread().getName()+"-"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test07 {
public static void main(String args[]) {
MyThread t=new MyThread();
//自定义名称的操作:传参 命名
new Thread(t,"我").start();
new Thread(t,"你").start();
//未命名,从0开始编号
new Thread(t).start();
}
}

线程的休眠

  就是让线程执行慢下来

  Thread.sleep(时间);

线程的优先级

class MyDThread extends Thread{
public void run(){
for (int i = 0; i <=5; i++) {
//获得当前线程的名字
System.out.println(Thread.currentThread().getName()+"-"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test08 {
public static void main(String args[]) {
MyDThread t=new MyDThread();
Thread t1=new Thread(t,"我");
Thread t2=new Thread(t,"你");
Thread t3=new Thread(t,"他");
/*
* 设置线程的优先级,1最低 10最高
* 优先级不是那么绝对的优先,只是有几率的优先
* 其实就是人民币玩家和普通玩家的区别
* 人民币玩家 <高优先 但不是无敌的> 普通玩家<也是有几率胜的>
*/
t2.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}

本章常见问题

1.一个JVM进程启动时至少启动几个线程?

  2个:main主线程   gc线程:垃圾回收

2.主线程main方法的优先级别是数字多少?

  中等级别5

线程的同步

同步:就是一个线程对象,要等待另一个线程对象执行完成之后的操作规则
两个方法:
    同步代码块
    同步方法
 同步异步的优缺点

  异步效率高
  同步线程安全

public class Test09 {
public static void main(String[] args) {
MyThread1 myThread=new MyThread1();
new Thread(myThread,"售货员A").start();
new Thread(myThread,"售货员B").start();
new Thread(myThread,"售货员C").start();
new Thread(myThread,"售货员D").start();
}
} class MyThread1 implements Runnable{
int count=5;
@Override
//synchronized public void run() { 同步方法,在方法前面加上synchronized
public void run() {
for (int i = 1; i <10; i++) {
synchronized (this) {
if(count>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖了第"+(count--)+"个包子");
}
} }
} }

死锁:当线程同步过多时,就会产生死锁

就好比我在天安门等你,你在王府井等我,我们都在等待,但永远等不到对方,最后就只能等死了.....

Java 多线程篇的更多相关文章

  1. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  2. Java多线程系列目录(共43篇)

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...

  3. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  4. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  5. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式

    概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...

  6. Java多线程系列--“基础篇”03之 Thread中start()和run()的区别

    概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...

  7. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  8. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  9. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

随机推荐

  1. drf实现图片验证码功能

    一.背景 在之前实现过django的图片验证码,有自己实现过的,也有基于django-simple-captcha的,都是基于form表单验证,若自己实现,可以获取相应的标签name便可以获取判断,若 ...

  2. JS检测是否是360浏览器

    // JavaScript Document //application/vnd.chromium.remoting-viewer 可能为360特有 var is360 = _mime("t ...

  3. python设计模式第六天【原型模式】

    1.定义 使用原型模式复制的对象与原来对象具有一样的结构和数据,有浅克隆和深克隆 2.应用场景 (1)希望复制原来对象的结构和数据胆步影响原来对象 3.代码实现 #!/usr/bin/env pyth ...

  4. QTP键盘操作笔记

    micCtrlDwn  Presses the Ctrl key. micCtrlUp  Releases the Ctrl key. micLCtrlDwn  Presses the left Ct ...

  5. SpringBoot2.0.3 + SpringSecurity5.0.6 + vue 前后端分离认证授权

    新项目引入安全控制 项目中新近添加了Spring Security安全组件,前期没怎么用过,加之新版本少有参考,踩坑四天,终完成初步解决方案.其实很简单,Spring Security5相比之前版本少 ...

  6. Spring Boot2.0自定义配置文件使用

    声明: spring boot 1.5 以后,ConfigurationProperties取消locations属性,因此采用PropertySource注解配合使用 根据Spring Boot2. ...

  7. JAVA spring配置文件总结

    首先来看一个标准的Spring配置文件 applicationContext.xml <?xml version="1.0" encoding="UTF-8&quo ...

  8. BZOJ3239Discrete Logging——BSGS

    题目大意:给出$P,B,N$,求最小的正整数$L$,使$B^L\equiv N(mod\ P)$. $BSGS$模板题. #include<set> #include<map> ...

  9. 【XSY2469】graph 分治 并查集

    题目大意 给你一张\(n\)个点\(m\)条边的无向图,问删去每个点后,原图是不是二分图. \(n,m\leq 100000\) 题解 一个图是二分图\(\Longleftrightarrow\)该图 ...

  10. AMH 软件目录介绍

    AMH系统shell脚本目录:/root/amh系统所有shell脚本文件目录,不可删除. 网站运行工作根目录:/home/wwwroot面板程序与新建虚拟主机网站都存放于此目录. 其中:/home/ ...