Java学习笔记——线程
线程:
- 定义:线程是程序内的一个单一的顺序控制流程,也被称为“轻型进程(lightweight process)” 或“执行上下文(execution context )”
- 线程用于分隔任务
- 线程类似于传统的顺序程序,都有一个执行的起点,经过一系列指令后到达终点。线程在执行过程中的任何时刻只能有一个执行点
- main()是一个特殊的线程
实现方法:
1.继承Thread
2.实现runnable接口
启动方式:
1.start() 交叉执行线程,一个等待即执行下一个,各个线程的xc1.start();
xc2.start();
xc3.start();
执行并不是顺序的,谁先获取cpu执行谁
2.run() 顺序执行线程,一个执行完才能执行下一个
线程共享资源:
设置为static静态
线程状态:
创建
就绪
执行
阻塞
死亡
线程通信:
线程常用方法:
Thread.currentThread().getName();获取正在执行的线程的名字
//主动放弃cpu执行权的三种方法
Thread.yield();thread的静态方法,当前执行线程放弃cpu执行权进入就绪态;
Thread.sleep(t); thread的静态方法,睡眠一段时间,进入阻塞态,时间到自动进入就绪态;
wait([t]);Object方法等待【一定时间】进入阻塞态,等待唤醒
notify()唤醒持有指定锁阻塞状态的线程任意一个,进入就绪
notifyAll()唤醒持有指定锁阻塞状态的所有进程,进入就绪
stop()终止线程
thread.setPriority(1--10);//线程优先级,1—10越来越大,只是提高获取cpu的概率,并不是优先级高的绝对先获取cpu
继承Thread过程
1.创建一个类继承Thread
2.重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置。)thread里的run()可以调用其他方法
3.创建子类对象,其实就是在创建线程
4.启动线程start()或者run()
这种方式的特点(缺陷):线程任务和线程是绑定在一起的。
实例:
class Ticket extends Thread{
private static int num = 50; //定义成static,四个线程共享50张票。
public void run() {
while(num>0)
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
}
class Maipiao{
public static void main(String[] args) {
Ticket win1 = new Ticket();
Ticket win2 = new Ticket();
Ticket win3 = new Ticket();
Ticket win4 = new Ticket();
win1.start();
win2.start();
win3.start();
win4.start();
}
}
实现runnable接口:过程
- 创建类并实现Runnable接口
- 重写Runnable接口中的run方法
- 创建实现了Runnable接口的子类的对象
- 创建Thread类的对象,也就是在创建线程
- 把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法
实例:
package thread;
/**
* 应用模块名称<p>
* 代码描述<p>
* Copyright: Copyright (C) 2019 XXX, Inc. All rights reserved. <p>
* Company: 河南863<p>
*
* @author 闫聪
* @since 2019/7/19 10:26
*/
public class Demo2 {
public static void main(String[] args) {
MyThreadTwo myThreadTwo = new MyThreadTwo();
Thread thread=new Thread(myThreadTwo,"窗口1");
Thread thread2=new Thread(myThreadTwo,"窗口2");
Thread thread3=new Thread(myThreadTwo,"窗口3");
Thread thread4=new Thread(myThreadTwo,"窗口4");
thread.start();
thread2.start();
thread3.start();
thread4.start();
//myThreadTwo.start();
}
}
class MyThreadTwo implements Runnable{
//方式二:成员变量属于共享资源,多个线程共享一个对象
private int num =100;
@Override
public void run() {
System.out .println ("ss"+num);
synchronized (this){
while(num>0){
num=num-1;
if(num==0){
this.notifyAll();
break;
}
System.out.println(Thread.currentThread().getName()+"...sale..."+num);
if(num<100&&num%2==0){
this.notify();
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
Java学习笔记——线程的更多相关文章
- Java学习笔记 线程池使用及详解
有点笨,参考了好几篇大佬们写的文章才整理出来的笔记.... 字面意思上解释,线程池就是装有线程的池,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程 ...
- Java 学习笔记 线程控制
题目一 本质上来说,线程是不可控制的,线程的执行是由CPU资源分配决定的,我们无法干预系统CPU的资源分配,但我们可以增加条件来让线程按照我们的预想顺序来执行. 比如.如果当前的执行的线程不满足我们所 ...
- java学习笔记 - 线程池(一)
线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销 优点:(面试题)可重复使用已有线程,避免对象创建.消亡和过度切换的性能开 ...
- java学习笔记 线程的实现与同步
2019.4.2 线程实现的两种方式 继承线程,复写其中的run方法 实现runnable接口,复写run方法 使用: MyThread target = new MyThread(); new Th ...
- Java学习笔记--线程day01
线程的概念:一个线程是进程的顺序执行流: 同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈.线程在切换时负荷小,因此,线程也被称为轻负荷进程.一个进程中可以有多个线程. ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
随机推荐
- blessed-contrib 开发终端dashboard 的几点说明
以前有说过blessed-contrib 这个很不错的终端dashboard 开发框架,以下是使用中的一些问题 中文编码 模式是不支持中文编码的,但是 我们可以在初始化的时候指定unicode编码 s ...
- python开发面试问题
python语法以及其他基础部分 可变与不可变类型: 浅拷贝与深拷贝的实现方式.区别:deepcopy如果你来设计,如何实现: __new__() 与 __init__()的区别: 你知道几种设计模式 ...
- 微信小程序 自定义导航组件 nav头部 全面屏设计
nav-dynamic 微信小程序自定义nav头部组件:适配全面屏设计: 实现功能 初始进入页面时,展示初始状态下的nav样式: 页面滚动时,监听页面滚动事件,展示滚动状态下的nav样式: 根据配置字 ...
- 2018传智黑马Python人工智能视频教程(基础+就业+面试)
2018传智黑马Python人工智能视频教程(基础+就业+面试) 2018传智黑马Python人工智能视频教程(基础+就业+面试) 2018传智黑马Python人工智能视频教程(基础+就业+面试) 下 ...
- TCP/IP协议族基本知识
常见的网络拓扑 两台主机通信的过程:应用进程产生消息,经由主机的 TCP/IP 协议栈发送到局域网(LAN),最后经过广域网(目前最大的广域网的因特网)中的网络设备(路由器)传给目的主机所在的局域网( ...
- MSSQL随机修改时间
GO DECLARE @BDate datetime, @EDate datetime SET @BDate = '20190801' --上限 SET @EDate = '20190819 23:5 ...
- cocos执行tolua/genbindings.py文件,错误搜集:
1.PYTHON_BIN not defined, use current python.这个不是错误 2.llvm toolchain not found!path: /Users/staff/Do ...
- redis集群搭建及启动、停止、重启操作【转】
redis版本:redis-5.0.3.tar.gz 操作系统:完全新安装的centos7.6系统 使用一台虚拟机模拟6个redis节点,3个master,3个slave,虚拟机IP为192.168. ...
- APP测试要点整理
APP测试基本流程以及APP测试要点https://www.cnblogs.com/dengqing9393/p/6497068.html 性能测试:https://blog.csdn.net/xia ...
- docker 镜像制作(jupyter)
docker pull centosdocker run -it -d --name test-centos1 centosdocker exec -it test-centos1 /bin/bash ...