博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础之多线程
阅读量:3955 次
发布时间:2019-05-24

本文共 2948 字,大约阅读时间需要 9 分钟。

线程

什么是线程?

  1. 在理解线程之前,先来说说什么是进程?

每个正在系统上运行的程序都是一个进程,每个进程包含一个或多个线程,进程可能是整个程序或程序一部分的动态执行。线程是一组指令的集合,或是一个程序部分特殊段,它可以独立运行在程序中。

线程怎么创建?

  1. 创建线程的两种方式

第一:一个类继承java.lang.Thread类,重写run()方法,调用start()启动线程

创建Running Man类

public class RunningMan extends Thread{
private String manName; public RunningMan(){
} public RunningMan(String manName){
this.manName=manName; } public String getManName() {
return manName; } public void setManName(String manName) {
this.manName = manName; } public void run(){
for(int i=1;i<=100;i++){
System.out.println(this.manName+"跑到了第"+i+"米"); } }}

创建TestMan类

public class TestMan {
public static void main(String[] args) {
//创建线程 RunningMan r1 = new RunningMan("罗伟"); RunningMan r2 = new RunningMan("丁伟伟"); RunningMan r3 = new RunningMan("憨憨"); RunningMan r4 = new RunningMan("苏炳添"); //启动线程 r1.start(); r2.start(); r3.start(); r4.start(); }}

第二:一个类实现java.lang.Runnable接口,重写run()方法,new Thread对象调用start()启动线程

创建Running Man类

public class RunningMan implements Runnable{
private String manName; public RunningMan(){
} public RunningMan(String manName){
this.manName=manName; } public String getManName() {
return manName; } public void setManName(String manName) {
this.manName = manName; } public void run(){
for(int i=1;i<=100;i++){
System.out.println(this.manName+"跑到了第"+i+"米"); } }}

创建TestMan类

public class TestMan {
public static void main(String[] args) {
//创建线程 RunningMan r1 = new RunningMan("罗伟"); RunningMan r2 = new RunningMan("丁伟伟"); RunningMan r3 = new RunningMan("憨憨"); RunningMan r4 = new RunningMan("苏炳添"); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); Thread t3 = new Thread(r3); Thread t4 = new Thread(r4); //启动线程 t1.start(); t2.start(); t3.start(); t4.start(); }

Thread类与Runnable接口的主要区别

  1. 线程类继承自thread类就不能继承自其他类,而Runnable接口可以。

  2. 线程类继承自thread类相对于实现Runnable接口,使用起来更方便。

  3. 线程类继承自thread类可以通过new 一个对象直接去调用start()方法开启一个,而实现了Runnable接口的类需要用他的对象实例作为Thread类构造方法的参数,创建一个Thread对象,去调用start()方法开启一个线程。

通过源码我们能看出Thread也是一个Runnable,它实现了Runnable接口

在这里插入图片描述

实际上最终被线程执行的任务是Runnable,Thread只是对Runnable的包装,并且通过一些状态对Thread进行管理与调度

Runnable接口定义了可执行的任务,它有一个无返回值的run()函数

在这里插入图片描述
线程的wait、sleep、join和yield函数

函数名 作用
wait 当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁,使得其他线程可以访问,用户可以用notify、notifyAll或者指定睡眠时间来唤醒当前等待池中的线程,注意:wait、notify、notifyAll必须放在synchronized block中,否则会抛出异常
sleep 该函数是Thread的静态函数,作用是使当前线程进入睡眠状态,因为其是静态方法,所以不会改变对象机锁,即使睡眠也持有对象锁,其他对象无法访问这个对象
join 等待目标线程完成后再执行
yield 让出执行权限,让其他线程得以优先执行,但其他线程能否优先执行是未知的,是由jvm内存分配的

**对象.wait():访问该线程的对象等,而不是调用wait()方法的对象等。

notify、notifyAll函数

notify用于唤醒另一线程,但对方是未知的。notifyAll用于唤醒其他所有的线程对象

更多文章

转载地址:http://znuzi.baihongyu.com/

你可能感兴趣的文章
boot asio 非阻塞同步编程---非阻塞的accept和receive。
查看>>
利用ADOX、ADO操纵MDB文件(ACCESS)
查看>>
使用ADO操作MDB,关注数据类型
查看>>
使用windows自带Zip命令压缩文件
查看>>
windows获得文件大小
查看>>
Host 'ETCV3' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
查看>>
OCILIB在VS2008中的使用
查看>>
OCILIB VC2008 效率测试
查看>>
PL/SQL设置NUMBER显示为字符串
查看>>
linux ftp 脚本 -- 使用程序执行脚本
查看>>
MFC CListBox的使用
查看>>
VS2008向MFC 对话框 添加托盘图标(显示和消失)
查看>>
redhat中vsftp开机自启动
查看>>
MySQL存储过程,生成大量数据
查看>>
查询字段值出现多次的字段值
查看>>
SQL Server表存在则进行查重 SQL语句
查看>>
redhat 9 下sqlite 3的安装及编程
查看>>
两个同步表的字段复制.Oracle.
查看>>
windows MySQL 报“Got a packet bigger than 'max_allowed_packet' bytes”错误,解决过程.
查看>>
在Redhat9下静态编译glib库.
查看>>