第36节:Java当中的线程

Java当中的线程
Java当中的线程,进程和线程的关系?进程就是线程吗?不是的。线程的运行,和方法。
多线程和多进程,多进程为在操作系统中同时进行多个应用程序,如你的电脑可以同时听音乐,同时上网,手机也可以,所以也就是多进程,原理上这些都是由cpu执行的,因为cpu执行很快,执行一个应用然后执行别的应用程序,然后再次回来执行,速度很快。(则cpu在进程中快速地来回切换)
多线程则是在一个应用程序中多个顺序流同时执行,线程就是执行任务,可以理解在一款软件中,同时执行任务,可以这么理解,多线程举例一边干嘛,一边又做别的。
线程的执行过程
一个应用程序,至少有一个Thread线程。
一个应用程序,可以有多个线程,由于线程之间执行(跳来跳去执行)切换特别快,所以我们误会,仿佛很多线程同时执行。
创建线程的方法
第一种:
定义一个线程类,将该类继承Thread类,然后重写其中的方法run(),在Java中是只支持单继承的,所以不能再继承其他类了。
class MyThread extends Thread{
public void run(){
System.out.println("dashucoding");
}
}
class Demo{
public static void main(String args[]){
// 创建线程对象
MyThread my = new MyThread();
// 启动线程
my.start();
}
}
在Java代码运行中,如果没有用start()开启线程,就只有一个主线程,那么就一个线程,此时就不是多线程了。
第二种:
实现线程,可以定义一个类去实现接口Runnable,作为线程的目标对象,初始化Thread类或者Thread子类的线程对象,把对象传递给线程实例,然后由对象提供线程体。
class MyRunnable implements Runnable{
public void run(){
...
}
}
class Demo{
public static void main(String args[]){
// 创建Runnable接口实现类的对象
Runnable r=new Runnable();
// 创建Thread对象,将Runnable接口实现类的对象作为参数,传递给Thread对象
Thread t = new Thread(r);
// 调用start()方法,开启线程
t.start();
}
}
线程的一些方法
一般常用的方法
public static void sleep(long millis);
public static void sleep(long millis, int nanos);
Thread.sleep(); // 睡眠
Thread.yield(); // 让出cpu
getPriority(); // 获取优先级
setPriority(); // 设置优先级
public Thread();
public Thread(Runnable target);
public Thread(Runnable target, String name);
public Thread(String name);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group,Runnable target, String name);
public void destroy(); :破坏线程
public void interrupt(); :中断线程运行
public final int getPriority(); :返回线程优先级
public final String getName(); :返回线程的名字
public final void setName(String name); :设置线程名
public final void setPriority(int newPriority); :设置线程优先级
多线程的安全,同步线程的方法
获取线程名字
Thread.currentThread().getName()
线程安全引入同步代码块synchronized
class MyThread implements Runnable{
int i = 10;
public void run(){
while(true){
// Thread.currentThread().getName()
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0){
break;
}
}
}
}
加锁格式:
class MyThread implements Runnable{
int i = 10;
public void run(){
while(true){
synchronized(this){
// Thread.currentThread().getName()
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0){
break;
}
}
}
}
}
synchronized关键字
synchronized锁住的什么呢?同步代码块的作用,同步方法的作用。锁住的是对象。
class Service{
public void fun(){
synchronized(this){
try{
Thread.sleep(3*1000);
}catch(Exception e){
System.out.println(e);
}
}
}
public void fun2(){
synchronized(this){
System.out.println("dashucoding");
}
}
}
// 线程
class MyThread1 implements Runnable{
private Service service;
public MyThread1(Service service){
this.service = service;
}
public void run(){
service.fun1();
}
}
// 线程
class MyThread2 implements Runnable{
private Service service;
public MyThread2(Service service){
this.service = service;
}
public void run(){
service.fun2();
}
}
// 测试
class Test{
public static void main(String args[]){
Service service = new Service();
Thread t1 = new Thread(new MyThread1(service));
t1.start();
Thread t2 = new Thread(new MyThread2(service));
t2.start();
}
}
线程在程序中是顺序执行的指令序列,多线程则是在程序中并发执行多个指令序列,线程是比进程小的执行单位,一个进程可以有多个线程,每个线程有自己的产生,存在和消亡的过程。
MIN_PRIORITY,MAX_PRIORITY和NORMAL_PRIORITY,分别代表:线程最低、最高和普通优先级的常量,优先级等级分别为1、10和5。
线程的同步与死锁
在同一进程中会有很多个线程,这些线程共同享受一个存储空间,这样就有个访问冲突的问题,有两个线程同时访问一个对象时,一个线程用来向对象存储数据,一个用来读取数据。
这时就遇到问题了,当这个线程还没有完成存储的操作,另一个线程就开始读取数据了,就会产生错误,这时在java线程中采用了同步机制,这样就不会出错了,因为只有一个线程完成它的操作之前,其他线程是不允许操作的。Java语言引入关键字synchronized,有两种方法:synchronized方法(解决同步的问题,但也有缺陷)和synchronized块。
synchronized(syncObject){
//允许访问控制的代码
}
线程的死锁
在Java中,线程同步解决了对象访问的冲突,但是同样带来了问题,就是线程的死锁,什么是线程死锁呢?
举个例子:一个线程拥有对象A,另一个线程拥有对象B,但是第一个线程必须拥有对象B才能继续,同时第二个线程必须拥有对象A才能继续。两个线程都在相互等待对方释放当前的对象,导致两个线程阻塞,发送了线程的死锁。
结语
- 下面我将继续对
Java、Android中的其他知识 深入讲解 ,有兴趣可以继续关注 - 小礼物走一走 or 点赞
第36节:Java当中的线程的更多相关文章
- 第55节:Java当中的IO流-时间api(下)-上
Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...
- 第54节:Java当中的IO流(中)
Java当中的IO流(中) 删除目录 // 简书作者:达叔小生 import java.io.File; public class Demo{ public static void main(Stri ...
- 第53节:Java当中的IO流(上)
Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...
- Java当中的线程
1.进程和线程 进程和线程之间是什么关系 多进程:在操作系统中能(同时)运行多个任务(程序) 多线程:在同一应用程序中有多个顺序流(同时)执行 线程的执行过程 2.定义线程的方法 方法1: 定义一个线 ...
- 第46节:Java当中的常量池
Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方 ...
- 第44节:Java当中的JVM
Java当中JVM 01 在使用控制面板时的实质: Hello.java使用javac,然后变成为Hello.class通过运行java这个命令,在类加载器中(含有加载,验证,准备,解析,初始化,使用 ...
- 第39节:Java当中的IO
Java当中的IO IO的分类 第一种分:输入流和输出流 第二种分:字节流和字符流 第三种分:节点流和处理流 节点流处理数据,处理流是节点流基础上加工的. IO中的重点: InputStream Ou ...
- 第51节:Java当中的集合框架Map
简书作者:达叔小生 Java当中的集合框架Map 01 Map提供了三个集合视图: 键集 值集 键-值 映射集 public String getWeek(int num){ if(num<0 ...
- 第48节:Java当中的集合框架
Java当中的集合框架 01 在我们班里有50位同学,就有50位对象. // 简书作者:达叔小生 Student[] stus = new Student[20]; 结果来了一位插班生,该同学因为觉得 ...
随机推荐
- python 将mysql数据库中的int类型修改为NULL 报1366错误,解决办法
gt.run_sql()是用pymysql 封装的类 distribution_sort_id type: int目的:将此字段值全部修改为NULL g=2gt.run_sql("updat ...
- hibernate session.createSQLQuery(sql); 通过命令删除
@Override public boolean deleteBySql(String sql) { Session session = getSession(); @SuppressWarnings ...
- applium安装过程中遇到的问题及解决方法。
1.安装appium server 之后, cmd输入appium-doctor,运行时提示'node'不是内部或外部的命令 一.提示'node'不是内部或外部命令,先按照下面步骤操作: 1.设置 ...
- web安全之机器学习入门——2.机器学习概述
目录 0 前置知识 什么是机器学习 机器学习的算法 机器学习首先要解决的两个问题 一些基本概念 数据集介绍 1 正文 数据提取 数字型 文本型 数据读取 0 前置知识 什么是机器学习 通过简单示例来理 ...
- 数据库database
1.创建数据库:create datebase financials create database if not exists financilas 2.查看数据库(所有): show da ...
- Filezilla server配置FTP服务器中的各种问题与解决方法
转至;https://www.jb51.net/article/122171.htm 安装文件以及补丁下载 公司很多资料需要通过ftp上传,那么就需要配置一个FTP服务器,找了一台Windows服务器 ...
- Ubuntu 下的QQ WECHAT FOXMAIL解决方案
原文链接: https://www.lulinux.com/archives/1319 真心很强大. Ubuntu系发行版*安装deepin wine QQ的步骤 1,安装deepin-wine环境: ...
- JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息
一,首先说明下这个微信的openid 为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开 ...
- 图解HTTP第三章
HTTP 报文内的 HTTP信息 用于 HTTP 协议交互的信息被称为 HTTP 报文.HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本. HTTP 报文大致可以分为两类:请 ...
- 地磁应用中的低功耗无线数传模块xbee PRO S2C
地球上每一个地理坐标点,在一段时间内磁场强度是恒定的,当车辆这种铁磁物质经过这个点时,对这个点的磁场强度产生一个连续的扰动,通过磁传感器采样数据与初始采样数据(该点的地球磁场值)进行对比,其差值为车辆 ...