ym——Java多线程(新)

本文介绍了Java中的多线程概念,包括进程与线程的区别,线程的两种实现方式(继承Thread类和实现Runnable接口)以及它们的区别。通过实例展示了线程的启动、同步和唤醒操作,讨论了线程同步可能导致的死锁问题,并探讨了使用多线程的原因和线程的生命周期。
摘要由CSDN通过智能技术生成

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!


线程

多线程概念、两种实现方式的区别进程与线程

从计算机操作系统的发展来看,经历了这样的两个阶段

单线程处理:最传统的DOS系统中只要有病毒出现,则立即有反映,因为在DOS系统中属于单进程处理,即:在同一个时间段上只有一个程序在执行。

多线程处理:windows操作系统是一个多进程,例如,假设在windows中出现病毒了,则系统一样可以使用

进程:正在进行中的程序。

1.png

那么对于资源来讲,所有的IO设备、CPU等等只有一个,那么对于多线程处理来讲,在同一个时间段上会有多个程序运行,但是在同一个时间点上只能有一个程序运行。

线程是在进程基础上的进一步划分,例子:word中的拼写检查,是在word整个程序

运行中运行 word是一个进程拼写检查可以当作一个线程,一个进程可以有多个线程,就类似于,开了一个游戏,游戏看做一个进程,游戏里面的玩家看作线程,游戏没有肯定玩家就没了,但是游戏里面玩家没了,游戏却还在。所以说线程是在进程基础上进一部划分

所以,如果进程消失了,则线程消失了,而如果线程消失的话,则进程依然会执行,未必会消失,java本身是属于多线程的操作语言,所以提供了线程的处理机制。

一个进程默认一个线程(main);

进程和线程切换,谁耗内存。

进程消耗性能一些,线程是在进程中切换不耗内存。

线程是CPU的最小执行单元。

所谓的线程是一组指令的集合。


线程实现的两种方式

java中可以有两种方式实现多线程操作,一种是是继承Thread类,另外一种是实现Runnable 接口。

Thread是在java.lang包中定义的。

一个类只要继承了Thread类,同时覆写了本类中的run()方法 ,则就可以实现多线程的操作了。

package com.cym.thread;
public class MyThread extends Thread {
    private String name;
    public MyThread(String name){
        this.name = name;
    }
    public void run(){
        for (int i = 0; i < 10; i++) {
            System.out.println(name + ":" + i);
        }
    }
}

以上的类已经完成了多线程的操作类,那么下面就启动线程

package com.cym.thread;
public class Main {
    public static void main(String[]args) {
        // TODO Auto-generated method stub
        MyThreadmt1 = new MyThread("A");
        MyThreadmt2 = new MyThread("B");
        mt1.run(); // 执行线程体
        mt2.run(); // 执行线程体
        
    }
}

但是、此时执行可以发现非常的有规律,先执行玩第一个对象的,再执行第二个对象,也就是说并没有现实交互的运行。
JDK文档可以发现,一旦调用start()方法,则会通过JVM找到run()方法

publicvoid start()

使用start启动线程

package com.cym.thread;
public class Main {
    public static void main(String[]args) {
        // TODO Auto-generated method stub
        MyThread mt1 = new MyThread("A");
        MyThread mt2 = new MyThread("B");
        mt1.start(); // 执行线程体
        mt2.start(); // 执行线程体
        
    }
}

此时程序已经可以进程交互式的运行了。

但是需要思考的是为什么要使用start()方法使用启动多线程?

JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread 类中的start()方法定义 :

  public synchronized void start() { // 定义的start()方法
     
       if (started) // 判断线程是否已经启动
           throw new IllegalThreadStateException();
       Stared = true; // 如果没有启动则修改状态
start0();  // 使用native 关键字声明的的方法,没有方法体.
       if (stopBeforeStart) {
           stop0(throwableFromStop);
       }
    }
private native void start0(); // 使用native 关键字声明的方法,没有方法体。

操作系统有很多,Windows、Linux、UNLX,既然多线程操作中要进行CPU资源的抢占,也就是说要等待CPU的调度,那么这些调度的操作是由各种操作系统的低层实现的,

所以在java程序中根本就没法实现,那么此时java的设计者定义了native关键字,使用此

关键字表示可以调用操作系统的底层函数,那么这种技术又称作为JNI技术(java nativeinterface

而且,此方法在执行的时候将调用run()方法完成,有系统默认调用的。

但是第一中操作中有一个最大的限制,一个类只能继承一个父类。

Runnable接口

<
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值