java_线程
线程1
与线程相关的概念
线程与进程的区别
线程创建策略
线程组
线程创建策略
并发应用中一般有两种不同的线程创建策略
1直接控制线程的创建和管理
2将线程的管理从应用程序中抽象出来作为执行器,应用程序将任务传递给执行器,由执行器负责执行。
线程2
在线程中实现自己的代码逻辑
有3种方式
从Thread类继承
实现runnable接口
使用方法引用到一个无参数无返回值的方法
将参数传入线程中
使用线程类属性的set方法
使用线程类的构造方法传值
package java20180203_1;
class Thread1 extends Thread {
private int num;
public void setNum(int num) {
this.num = num;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1:" + i+","+num);
}
}
}
class Thread2 implements Runnable {
private int num;
public Thread2(int num) {
this.num = num;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2:" + i+","+num);
}
}
}
public class ThreadDemo {
static void print(){
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread4:" + i);
}
}
public static void main(String[] args) throws Exception {
/**
* 线程组,将线程加入到线程组
*/
Thread t1 = new Thread();
t1.start();
ThreadGroup tg1 = new ThreadGroup("ThreadGroup");
Thread t2 = new Thread(tg1, "t2");
/**
* 从Thread类继承,这是子线程1
*/
Thread1 th1 = new Thread1();
//使用线程类set属性进行传值
th1.setNum(200);
th1.start();
/**
* 实现runnable接口,这是子线程2
*/
//使用构造方法传值
Runnable r2 = new Thread2(300);
Thread t3 = new Thread(r2);
t3.start();
/**
* 用lambda表达式来实现相同的功能,这是子线程3
*/
new Thread(() -> {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread3:" + i);
}
}).start();
/**
* 方法引用来创建线程
*/
new Thread(ThreadDemo::print).start();
/**
* 这是main线程的循环
* 总共有4个线程,一个是main主线程的循环,其余3个是子线程的循环,有3个start,它们是并行的,可以从结果中看到。
* 分发给不同的处理器来执行
*/
for (int i = 0; i < 100; i++) {
Thread.sleep(500);
System.out.println("main:" + i);
}
}
}
线程3
获取线程的信息
线程优先级
线程串行化
线程休眠
获取线程的信息
currentThread()
getName
优先级
默认优先级是5,子默认与父优先级相同,共10个,从1到10。
串行化
若一个线程运行的过程中要用到另一个线程的结果,则可以进行线程的串行化处理
join()方法
休眠
sleep()方法,暂停时间不精确
线程4
线程的状态
线程中断
线程停止
守护线程
线程的状态
可以使用getState()来获取,有New,Runnable,Blocked,Waiting,ThreadWaiting,Dead这6种状态
线程停止
开发中使线程停止的方式不是使用其stop(),已经不推荐使用了
而是使用标识量来停止线程
package java20180205;
public class InterruptDemo {
public static void main(String[] args) throws Exception {
Thread t1=new Thread(()->{
for (int i = 0; i < 20; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
for (int i = 0; i < 20; i++) {
System.out.println("main:"+i);
Thread.sleep(300);
}
t1.interrupt();
/**
* 一个是false,一个是true
*/
// System.out.println(t1.interrupted());
// System.out.println(t1.isInterrupted());
}
}
package java20180205;
class Thread4 implements Runnable{
private boolean stop=false;
public void setStop(boolean stop) {
this.stop = stop;
}
@Override
public void run() {
for (int i = 0;; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (stop) {
break;
}
System.out.println(i);
}
}
}
public class StopDemo {
public static void main(String[] args) throws Exception {
// Thread4 t4=new Thread4();
// new Thread(t4).start();
// Thread.sleep(4000);
// t4.setStop(true);
Thread4 t4=new Thread4();
Thread t5=new Thread(t4);
t5.setDaemon(true);
t5.start();
Thread.sleep(4000);
}
}
线程5
多线程访问共享数据的问题
java内存模型
案例
使用多个线程调用一个账号实例中的取款方法
java内存模型
线程安全术语
线程6
对象监视器
synchronized关键字
volatile变量
对象监视器
临界区,监视器上加锁
synchronized关键字
用于声明临界区
两种方法:
synchronized方法
实例方法:锁加在实例上
静态方法:锁加在类上
synchronized块
线程7 05:29
生产者消费者模型
wait与sleep的区别
生产者消费者模型
线程间通信的另一种方式,是一个非常经典的模型
java_线程的更多相关文章
- java_线程-锁
package com.demo.test3; import java.util.concurrent.CountDownLatch; /** * @author QQ: 1236897 * */ / ...
- java_线程安全-service
package com.demo.test; import java.util.Collections; import java.util.HashMap; import java.util.Map; ...
- java_线程的几种状态
java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...
- java_线程的通信
线程的通信共有三个方法: wait()运行时阻塞,释放锁 notify()唤醒阻塞线程 notifll()唤醒全部阻塞线程 public class ThreadTest01 { public sta ...
- java_线程分类
线程分为守护线程和用户线程,如java虚拟机的回收机制就是守护线程,线程开始运行它就启动,线程结束它就结束 用户线程变守护线程:Thread(线程).setDaemon(true)
- java_线程优先级
线程优先级分为三个等级: MAX_PIORITY:10 优先 MIN_PRIORITY:1 NORM_PRIORITY:5 默认 getPriority:获取优先级 setPriority:设置优 ...
- java_线程类的基本功能
Thread类是实现了Runnable接口 其方法有: start()开始:开始线程 run()跑:线程内容 currentThread()现在的线程:返回当前线程 getName():获取线程名 s ...
- java_线程创建的两种方法
线程创建的方法有两种: 一 继承Thread类: public class ThreadTest { public static void main(String[] args) { //4)在mai ...
- java_线程、同步、线程池
线程 Java使用 java.lang.Thread 类代表线程,所有的线程对象都必须是Thread类或其子类的实例 Thread类常用方法 构造方法 public Thread():分配一个新的线程 ...
随机推荐
- Linux下修改用户的UID、GID
01.用户的UID和GID不能被占用 [root@26 ~]# id mvpuid=503(mvp) gid=503(mvp) groups=503(mvp) ###假定我需要设置mvp的uid/gi ...
- (20)gevent协程
协程: 也叫纤程,协程是线程的一种实现,指的是一条线程能够在多任务之间来回切换的一 种实现,对于CPU.操作系统来说,协程并不存在 任务之间的切换会花费时间.目前电脑配置一般线程开到200会阻塞卡顿 ...
- 了解FPGA市场现状和未来趋势
转, 来源: http://www.sohu.com/a/204640373_740053 可编程的“万能芯片” FPGA——现场可编程门阵列,是指一切通过软件手段更改.配置器件内部连接结构和逻辑单元 ...
- Gerapy的简单使用
1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待当前URL抓取完毕之后在进行下一个URL的抓取,抓取效率可以提高很多. 2. Scrapy-redis:虽然S ...
- Visual Basic 2017 操作Excel和word【2】持续更新……
1.控制台程序创建Excel,并设置状态栏显示“Hello World”文本 Module Module1 Private exitXL As Boolean = False Dim WithEven ...
- 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象
学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...
- 学习java的第4天 (2019-03-21 11:49)
学习java的第4天 好文要顶 关注我 收藏该文 里里零关注 - 0粉丝 - 0 0 0 posted on 2019-03-21 11:49 编辑 抱歉! ...
- guava-retrying 源码解析(等待策略详解)
一.等待策略相关类: 1.等待策略接口:WaitStrategy接口 该接口只有一个方法,就是返回尝试失败之后,下一次尝试之前的等待时间.long computeSleepTime(Attempt f ...
- flex 1与flex auto
flex意为"弹性布局" 这次主要探究的是flex:1与flex:auto的区别,flex是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 ...
- 入门项目 A1 start
''' 启动文件入口 ''' from core import src import os import sys # 拿到项目的路径 path = os.path.dirname(__file__) ...