第36节:Java当中的线程

作者 : 开心源码 本文共3530个字,预计阅读时间需要9分钟 发布时间: 2022-05-12 共64人阅读

标题图

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(); // 让出cpugetPriority(); // 获取优先级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_PRIORITYMAX_PRIORITYNORMAL_PRIORITY,分别代表:线程最低、最高和普通优先级的常量,优先级等级分别为1、10和5。

线程的同步与死锁

在同一进程中会有很多个线程,这些线程共同享受一个存储空间,这样就有个访问冲突的问题,有两个线程同时访问一个对象时,一个线程使用来向对象存储数据,一个使用来读取数据。

这时就遇到问题了,当这个线程还没有完成存储的操作,另一个线程就开始读取数据了,就会产生错误,这时在java线程中采使用了同步机制,这样就不会出错了,由于只有一个线程完成它的操作之前,其余线程是不允许操作的。Java语言引入关键字synchronized,有两种方法:synchronized方法(处理同步的问题,但也有缺陷)和synchronized块。

synchronized(syncObject){   //允许访问控制的代码}

线程的死锁

Java中,线程同步处理了对象访问的冲突,但是同样带来了问题,就是线程的死锁,什么是线程死锁呢?

举个例子:一个线程拥有对象A,另一个线程拥有对象B,但是第一个线程必需拥有对象B才能继续,同时第二个线程必需拥有对象A才能继续。两个线程都在相互等待对方释放当前的对象,导致两个线程阻塞,发送了线程的死锁。

结语

  • 下面我将继续对JavaAndroid中的其余知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞

上一篇 目录 已是最后

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 第36节:Java当中的线程

发表回复