java记录5--线程
------------恢复内容开始------------
1.什么叫程序:是一个严格有序的指令集合。程序规定了完成某一任务时,计算机所需做的各种操作,已经执行顺序。
特点:资源的独占性 执行的顺序性 结果的再现性
ps;多道程序:存在多个用户程序,这些程序同时运行
特点:间断性:由于资源共享和合作,并发程序间互相制约,造成合作执行间断
失去封闭性:程序执行可以受外界影响
不可再现性:重复执行时,可能得到不同结果
2.进程的由来:为了不破坏“程序”这个词原来的含义,而又能刻画多个程序共同运行时呈现出的新特征,所以引入了进程这一概念
进程:程序只是一组指令的有序集合,而进程是程序在某个数据集上的执行。进程是一个动态的实体,有自己的生命周期。
因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤销。
3。线程:一个程序里不同的执行路径
以前所编写的程序,只有一个入口,出口,只有一个单独的执行点。
事实上,单个程序内部是可以在同一时刻进行多种运算,这就是所谓的多线程
4.如何创建一个线程
4.1创建一个继承Thread的类,假设类名为A,并重写Thread中的run方法
4.2构造一个A类对象,假设对象名为aa;
4.3调用aa的start方法(从thread继承而来)
public class A
{
public static void main(String[] args)
{
B aa = new B();
aa.start();
while(true)
{
System.out.println("aaaa");
}
}
}
class B extends Thread
{
public void run()
{
while(true)
{
System.out.println("AAAA");
}
}
}
ps:1.thread中的start()方法的功能就是创建一个新的线程,并自动调用该线程的run()方法,直接调用run()方法是
不会创建一个新的线程的
2.执行一个线程实际就是执行该线程run方法中的代码
3.执行完aa。start()后并不代表aa所代表的线程一定会被执行,只是代表该线程具有了可以被cpu执行的资格,但由于想抢占cpu的线程很多,cpu并不一定会立即去执行aa所对应的线程
4.一个thread对象能且只能代表一个线程,不能调用两次start()方法;否则会抛出
java.lang.IIIegalThreadStartException异常
创建一个新线程的第二种方法
1.定义一个实现了Runnable接口的类,假设为A
2.创建A类对象aa; A aa = new A();
3.利用aa构造一个Thread对象tt
Thread tt = new Thread(aa);
4.调用tt中的start方法 tt.start();
thread的常用方法
1Thread.Name(String name)
设置当前线程的名字
2.Thread.currentThread()
返回对当前正在执行线程对象的引用
3.Thread。getName()
返回当前线程的名字
public class A
{
public static void main(String[] args)
{
T t = new T();
t.setName("呀哈哈"); //不能写成setName("呀哈哈");
t.start(); for (int i=0; i<30; ++i)
{
System.out.printf("嘿嘿\n");
System.out.printf("%s线程被调用了\n", Thread.currentThread().getName());
}
}
} class T extends Thread
{
public void run()
{ for (int i=0; i<30; ++i)
{
System.out.printf("哈哈\n");
System.out.printf("%s线程被调用了\n", Thread.currentThread().getName());
}
} }
线程的控制
1.isAlive() 判断线程是否还存在,即线程是否还未终止
2.setPriority()设置线程的优先级数值 //线程的优先级用数字表示,范围从1到10逐渐升高
3.getPriority()获得线程的优先级数值 //住线程优先级是5,子线程优先级默认与父线程相同
4.Thread.sleep()为当前线程睡眠设定毫秒数
5.join() 调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行
6.yield() 让出cpu,当前线程进入就绪等待调度
7.wait() 当前线程进入对象的wait pool
8.notify()/notyfyAll() 唤醒对象的wait pool 中的一个/所有等待线程
线程的休眠:暂停执行当前运行中的线程,使之进入阻塞状态,经过指定的时间再醒来转入就绪状态。
public static void sleep(long millis) 静态方法,可由thread直接调用
sleep()方法会抛出interrupted Exception异常,必须得对其进行捕获
public class TestSleep{
public static void main(String[] args){
A aa = new A();
Thread tt = new Thread(aa);
tt.start();
}
}
class A implements Runnable{
public void run(){
for (int i=0; i<10; ++i){
System.out.println(Thread.currentThread().getName() + " " + i);
try{
Thread.sleep(1000); //这里的Thread.sleep(1000)会抛出异常,必须
//的进行捕捉,不能在run的后面添加 throws Exception
}catch (Exception e){ }
}
}
}//原因:重写方法抛出异常的范围不能大于被重写方法排除的异常范围
线程的让步:让运行中的线程主动放弃当前获得的cpu处理机会,并不是使该线程阻塞,而是让其转入就绪状态
public class TestYield
{
public static void main(String[] args)
{
MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt); t1.setName("线程A");
t2.setName("线程B"); t1.start();
t2.start();
}
}
class MyThread implements Runnable
{
public void run()
{
for(int i=1;i<=100;i++)
{
System.out.println(Thread.currentThread().getName()+": "+i);
if(0 == i%10)
{
Thread.yield();
}
}
}
}
线程的串行化:在多线程程序中,如果一个线程运行的过程中要用到另一个线程的运行结果,则可进行线程的串行化处理;public final void join()
public class TestJoin {
public static void main(String args[]){
MyRunner r = new MyRunner();
Thread t = new Thread(r);
t.start();
try{
t.join(); //7行 暂停当前正在执行t.join();的线程,直到t所对应的线程运行终止之后,
当前线程才会获得继续执行的机会
}catch(InterruptedException e){
e.printStackTrace();
}
for(int i=0;i<50;i++){
System.out.println("主线程:" + i);
}
}ps:t.join()不是暂停t对象所对应的线程
} class MyRunner implements Runnable {
public void run() {
for(int i=0;i<50;i++) {
System.out.println("子线程: " + i);
}
}
}
关键词 Synchronized (同步) 用来修饰一个方法或一个方法内部的某个代码块
格式 synchronized(类对象名a){ 同步代码块 }
意义:判断a是否已经被其他线程霸占(锁定),如果发现已经被其他线程霸占,则当前线程陷入等待,如果a没有被其他线程霸占,则当前线程霸占a对象,并执行同步代码块,在当前线程执行同步代码时,其他线程将无法再执行,当前线程执行完3行代码后,会自动释放对a对象的霸占,此时其他线程会相互竞争对a的霸占,最终cpu会选择某一个线程执行。
结果:一个线程正在操作某资源的时候,将不允许其他线程操作该资源,即一次只允许一个线程处理该资源。
修饰方法时,实际锁定的是该方法的this指针所指向的对象,锁定正在调用该方法的对象(监听器)
notify和wait方法补充
1.不是叫醒正在执行this。notify()的当前线程,而是叫醒一个正在wait this对象的其他线程,如果有多个对象正在等待,通常是叫醒最先等待的线程,但具体叫醒哪一个,由系统调度器控制,程序员无法操控。同时,如果执行notify方法时一个线程也没有叫醒,也是可以的。
------------恢复内容结束------------
java记录5--线程的更多相关文章
- java基础九[网络与线程](阅读Head First Java记录)
网络socket连接 Java API的网络功能包(java.net)已经将底层的TCP连接等都封装好了,我们只需要通过Socket对象来建立客户端和服务器的连接,然后客户端能向服务器发送请求,并接收 ...
- Java并发之线程管理(线程基础知识)
因为书中涵盖的知识点比较全,所以就以书中的目录来学习和记录.当然,学习书中知识的时候自己的思考和实践是最重要的.说到线程,脑子里大概知道是个什么东西,但很多东西都还是懵懵懂懂,这是最可怕的.所以想着细 ...
- Java多线程之线程池详解
前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...
- java命令分析线程死锁以及内存泄漏
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- [Java Performance] JVM 线程调优
调整线程栈空间 当很缺少内存时,能够调整线程使用的内存. 每一个线程都有一个栈,用来记录该线程的调用栈信息.线程中的栈的默认空间是有OS和JVM的版本号决定的: OS 32-bit 64-bit Li ...
- Java并发之——线程池
一. 线程池介绍 1.1 简介 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡 ...
- Java实现终止线程池中正在运行的定时任务
源于开发 最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然, ...
- Java并发包——线程池
Java并发包——线程池 摘要:本文主要学习了Java并发包中的线程池. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520/p/3932921.html ...
- Java并发编程——线程池的使用
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- java中的线程安全
在Java中,线程的安全实际上指的是内存的安全,这是由操作系统决定的. 目前主流的操作系统都是多任务的,即多个进程同时运行.为了保证安全,每个进程只能访问分配给自己的内存空间,而不能访问别的.分配给别 ...
随机推荐
- Mount命令的参数详解
导读 mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了. 挂接命令(mount) 首先,介绍 ...
- AngularJS请求数据提示resource from url not allowed by $sceDelegate policy
AngularJS iframe跨域打开内容时报错 解决方案 使用 $sceDelegateProvider 配置跨域请求域名 config.js app.config(function($sce ...
- HDU2444 The Accomodation of Students(二分图最大匹配)
有n个关系,他们之间某些人相互认识.这样的人有m对.你需要把人分成2组,使得每组人内部之间是相互不认识的.如果可以,就可以安排他们住宿了.安排住宿时,住在一个房间的两个人应该相互认识.最多的能有多少个 ...
- JVM系列(四)之GC调优
JVM内存参数调优 为什么要GC调优? 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但当你的系统时常报了内存溢出或者 ...
- dp(装箱)
请小伙伴们对自己AC的题目进行标记,注意每人只能标记一次!不知道的不要标记,恶意标记者将回收账号!!! 问题 B: 装箱问题 时间限制: 1 Sec 内存限制: 128 MB[提交] [状态] 题目 ...
- rsync+inotify实现主机之间目录实时同步
原理: rsync:用于跨主机目录同步 inotify:用于监测目录变化 再编写一个触发脚本,一旦inotify检测到目录中内容发生变化,则调用rsync执行同步. rsync服务器的的配置: 因为r ...
- Vue CLI 3搭建vue+vuex 最全分析
一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue ...
- spring web 测试用例
spring web 测试有三种方式 1. 自己初始化 MockMvc 2.依赖@springbootTest 它会帮你生产 webTestClient ,只需自己注入即可. 3.启动的时候,不加载整 ...
- POJ-2891 Strange Way to Express Integers(拓展中国剩余定理)
放一个写的不错的博客:https://www.cnblogs.com/zwfymqz/p/8425731.html POJ好像不能用__int128. #include <iostream> ...
- 人工智能、大数据、物联网、区块链,四大新科技PK,你更看好谁?
最近行业中备受关注并且非常火热的产业有哪些呢?小编这边总结了一下,一共有4个,分别是人工智能.大数据.物联网和区块链,这四种新科技也一直是蓄势待发,未来将引领新一代的科技成长,也会带给人类很多更方便快 ...