多线程的简单实现(一):

多线程的简单实现(一):

一、说明:本身线程就是一门大的课程,在此只做基本的java中的基本认识。
在这里插入图片描述

概念

a.程序:是一个静态的概念,一般对应于操作系统中的一个可执行文件,比如:我们要启网易云听音乐,则对应网易云的可执行程序。当我们双击网易云,则加载程序到内存中,开始执行该程序,于是产生了“进程”。
​ (完成特定任务,用某种语言编写的一组指令的集合。)
b.进程:现代的操作系统都可以同时启动多个进程。比如:我们在用网易云听音乐,也可以使用IDEA写代码,也可以同时用浏览器查看网页。
在这里插入图片描述

​ (正在运行中的一个程序,有自身的产生,存在和消亡)。

c.线程: 一个进程可以产生多个线程。同多个进程可以共享操作系统的某些资源一样,同一进程的多个线程也可以共享此进程的某些资源(比如:代码、数据),所以线程又被称为轻量级进程(lightweight process)。

​ (进程进一步,程序内部执行路径,多个线程共享内存和地址空间。)

1. 一个进程内部的一个执行单元,它是程序中的一个单一的顺序控制流程。

2. 一个进程可拥有多个并行的(concurrent)线程。

3. 一个进程中的多个线程共享相同的内存单元/内存地址空间,可以访问相同的变量和对象,而且它们从同一堆中分配对象并进行通信、数据交换和同步操作。

4. 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。
5. 线程的启动、中断、消亡,消耗的资源非常少。
在这里插入图片描述

并行:当两个或者多个事件在同一时刻发生。

并发:是指两个或多个事件在同一时间间隔发生。

二.实现多线程:

1.继承Thread类实现

public class TestThread extends Thread {//自定义类继承Thread类
}

2.重写Thread类的run方法

public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(this.getName() + ":" + i);//getName()方法是返回线程名称
        }
    }

3.创建Thread类的子类对象

 TestThread thread1 = new TestThread();//创建线程对象

4.调用Start()方法。

  thread1.start();//启动线程

实现多线程

1.实现Runnable接口:

public class TestThread2 implements Runnable {//自定义类实现Runnable接口;

2.重写run()方法:

 //run()方法里是线程体;
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

3.创建线程对象,把实现了Runnable接口的对象作为参数传入

  Thread thread1 = new Thread(new TestThread2());

4.启动线程

  thread1.start();

实例

public class TestThread2 implements Runnable {//自定义类实现Runnable接口;
    //run()方法里是线程体;
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
    public static void main(String[] args) {
        //创建线程对象,把实现了Runnable接口的对象作为参数传入;
        Thread thread1 = new Thread(new TestThread2());
        thread1.start();//启动线程;
        Thread thread2 = new Thread(new TestThread2());
        thread2.start();
    }
}

方法

​ void Start():启动

​ run():重写

​ getName():返回线程名称

​ voidSetName():设置线程名称

​ yield():释放cpu的执行权

​ join():阻塞

​ sleep():睡觉

​ interrupt():中断线程

实例

package ticket;

public class Tickets {

    static private int count = 10;
    static private int num;

    static class BuyerThread extends Thread {
        private Tickets ticket;
        public BuyerThread(Tickets ticket) {
            this.ticket = ticket;
        }
        @Override
        public void run() {
            while (true) {
            synchronized (TestSynchronized.class) {
                    if (count > 0) {
                        count--;
                        num++;
                        System.out.println( Thread.currentThread().getName() + "购票成功,已出售"+num+"  剩余" + count );
                    } else {
                        break;
                    }
                    try {
                        sleep( 1 );
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
==
    package ticket;
public class TestSynchronized {
    public static void main(String[] args) {
        Tickets ticket = new Tickets();
        Tickets.BuyerThread buyerThread = new Tickets.BuyerThread( ticket );
        buyerThread.setName("张三");
        Tickets.BuyerThread buyerThread1 = new Tickets.BuyerThread( ticket );
        buyerThread1.setName( "李四" );
        Tickets.BuyerThread buyerThread2 = new Tickets.BuyerThread( ticket );
        buyerThread2.setName( "黄牛" );
        buyerThread.start();
        buyerThread1.start();
        buyerThread2.start();
    }
}
==
    结果:
张三购票成功,已出售1  剩余9
张三购票成功,已出售2  剩余8
张三购票成功,已出售3  剩余7
张三购票成功,已出售4  剩余6
张三购票成功,已出售5  剩余5
张三购票成功,已出售6  剩余4
张三购票成功,已出售7  剩余3
张三购票成功,已出售8  剩余2
张三购票成功,已出售9  剩余1
张三购票成功,已出售10  剩余0

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值