Java线程问题(基础回顾)
1、概念:线程是运行程序(进程)中单个顺序的小程序,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使得线程间的通信比较容易。在一个多进程的程序中,如果要切换到另一个进程,需要改变地址空间的位置。然而在多线程的程序中,就不会出现这种情况,因为它们位于同一个内存空间内,只需改变运行的顺序即可。
2、什么是多线程:多线程指单个程序可通过同时运行多个不同线程,以执行不同任务。所谓同时,也要依据CPU。如果是多个CPU,则并发运行,如是一个CPU,则根据系统具体情况,执行多个线程。
3、创建线程的方法一般有两种:
一种是通过实现Runnable接口的方式创建线程。
一种是通过从Thread类中去继承来创建线程。
4、线程的优先级:
【Demo】
computer t = new compute(); computer1 t = new compute1(); //setPriority是一个从1~10之间的正整数,数值越大,优先级别越高 //系统默认的优先级是5 t.setPriority(10); t.start(); t1.start();
5、线程的休眠与唤醒:
//休眠
sleep(毫秒数);
//唤醒
【Demo】
compute t = new computer(); t.start(); t.interrupt();
class compute extends Thread{
int i=0;
public void run()
{
System.out.println("在工作中,不要打扰");
try
{
sleep(1000000);
}
catch(Exception e)
{System.out.println("哦,电话来了");
}
}
}
因为使用了唤醒语句后,在输出“在工作中,不要打扰”后休眠。然后又立即会被唤醒输出“哦,电话来了”。
6、线程让步:
所谓线程让步,就是使当前正在运行的线程对象退出运行状态,让其他线程运行,其方法是通过调用yield()来实现。这个方法不能将运行权让给指定的线程,只是允许这个线程把运行权让出来,至于给谁,这就是抢占功能的事情了。
【Demo】
public class thread1{
public static void main(String[] args){
compute t = new compute();
compute t1 = enw compute1();
t.start();
t1.start();
}
}
class compute extends Thread{
int i=0;
public void run(){
for(int i=0;i<10;i++){
System.out.println(i);
yield();
}
}
}
class compute1 extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println("这个数字是:"+i);
}
}
}
运行结果:
0
这个数字是:0
这个数字是:1
这个数字是:2
这个数字是:3
这个数字是:4
这个数字是:5
这个数字是:6
这个数字是:7
1
这个数字是:8
这个数字是:9
2
3
4
5
6
7
8
9
从运行结果来看,第一个线程比第二个线程运行的几率要小,因为它总是放弃运行权。
7、线程同步:
【Demo】
public class thread11{
public static void main(String[] args){
compute t = new compute();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class compute extends Thread{
int i=10;
static Object obj= new Object();
public void print(){
System.out.println(Thread.currentThread().getName()+":" +1);
i--;
}
public void run(){
while(i>0){
synchronized(obj){
print();
}
try
{
sleep(1000);
}
catch(Exception e){}
}
}
}
运行结果
Thread-1:10
Thread-2:9
Thread-3:8
Thread-1:7
Thread-2:6
Thread-3:5
Thread-1:4
Thread-2:3
Thread-3:2
Thread-1:1
这里用到的是同步块的概念
synchronized(someobject)
{
代码块
}
也可以写成同步化方法的方式
synchronized void f()
{
代码块
}
【Demo】
synchronized void print(){
System.out.println(Thread.cui--);
}
答疑-线程和线程之间怎么通信?
答:共享一个变量,并对此变量的访问进行同步,因为它们共享一个内存空间,所以相比之下,它比进程之间通信要简单容易的多。
答疑-什么是线程的饥饿?
答:饥饿是由于别的并发进程的激活,而导致持久占有所需资源。饥饿是一个异步过程,预测的时间内不能被激活,最常遇到的线程的两个缺陷是死锁和饥饿。
答疑-什么是线程的死锁?
答:当一个或多个进程,在一个给定的任务中,协同作用、互相干涉,而导致一个或者更多进程永远等待下去,死锁就发生了。
与此类似,当一个进程永久性地占有资源,使得其他进程得不到该资源,就发生了饥饿。
Java线程问题(基础回顾)的更多相关文章
- Java线程核心基础(上)
Java线程核心基础(上) 一.实现多线程 根据Oracle官方文档,目前推荐的创建线程方法主要有两种,分别是继承Thread类和实现Runnable接口.通过阅读Thread类源码,可以发现二者不同 ...
- Java线程池基础
目录: 一.线程池概述 二.线程池参数 三.线程池的执行过程 四.线程池的主要实现 五.线程池的使用 六.线程池的正确关闭方式 七.线程池参数调优 一.线程池概述 1.线程池类 目前线程池类一般有两个 ...
- Java线程并发控制基础知识
微博上众神推荐今年4月刚刚出版的一本书,淘宝华黎撰写的<大型网站系统与Java中间件实践>,一线工程师的作品,实践出真知,果断要看. 前两章与<淘宝技术这十年>内容类似,基本是 ...
- Java线程之基础
Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial 一.线程的生命周期及五种基本状态 线程生命周期:新建.就绪.运行.阻塞.死亡 ...
- java线程锁基础
定义运行方法 package com.company; // 包名import java.util.concurrent.locks.ReentrantLock;import java.util.co ...
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型
关于线程,博主写过java线程详解基本上把java线程的基础知识都讲解到位了,但是那还远远不够,多线程的存在就是为了让多个线程去协作来完成某一具体任务,比如生产者与消费者模型,因此了解线程间的协作是非 ...
- Java线程和多线程(十三)——Callable,Future,FutureTask
在Java多线程之中,Callable和Future的使用时非常广泛的.在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务.但是,Runnable的任务是无 ...
- 多线程(一)java并发编程基础知识
线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...
- java基础回顾(五)线程详解以及synchronized关键字
本文将从线程的使用方式.源码.synchronized关键字的使用方式和陷阱以及一些例子展开java线程和synchronized关键字的内容. 一.线程的概念 线程就是程序中单独顺序的流控制.线程本 ...
随机推荐
- 团体程序设计天梯赛L2-013 红色警报 2017-03-23 22:08 55人阅读 评论(0) 收藏
L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...
- CSS:如何清除a标签之间的默认留白间距
即使我们使用了类似 *{margin: 0;padding: 0;} 这样的代码重置了浏览器默认样式,也会发现类似<a>标签这种inline-block元素,它们之间也还存在着间距. de ...
- [自动化专题]JDBC操作mysql时遇到的拦路虎
在挫折中成长,在错误中学习.聊聊我们在Selenium自动化中使用JDBC操作mysql数据库中遇到的那些拦路虎: 错误一:Can not issue data manipulation statem ...
- javascript点击兼容所有浏览器封装
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CentOS6.9 minimal版本安装图形化界面
CentOS6.9 minimal版本安装图形化界面 安装步骤如下: 1.安装Desktop组 # yum groupinstall "Desktop" -y 2.安装X Wind ...
- iptables总结
iptables: 包过滤型防火墙 Firewall: 防火墙,隔离工具:工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到 ...
- 打扮IDEA更换主题
原文链接:https://blog.csdn.net/github_39577257/article/details/80629750 当我们安装一个新的IDEA工具时,第一次进入时会提示我们选择一个 ...
- jenkins定时
分别的定义为:分 时 天 月 星期 Minutes within the hour (0–59) HOUR Thehour of the day (0–23) DOM Th ...
- css加载顺序
最近发现个有意思的事情,印象中的是css中class后面会覆盖前面的, 于是写了代码 div{ width: 100px; height: 100px; } .red{ background-colo ...
- sql 列集合
STUFF((SELECT ','+CAST( TYZ_Bh as varchar(10)) FROM #1 where 片区划分='江东' for xml path('')),1,1,'')