A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

黑马,我在路上之JAVA多线程:

程序(program)是对数据描述与操作的代码的集合,是应用程序执行的脚本。
进程(process)是程序的一次执行过程,是系统运行程序的基本单位。程序是静态的,进程是动态的。系统运行一个程序即是一个进程从创建运行到消亡的过程。
多任务(multi task)在一个系统中可以同时运行多个程序,即有多个独立运行的任务,每个任务对应一个进程。
线程:比进程更小的运行单位,是程序中单个顺序的流控制。一个进程中可以包含多个线程。

简单来讲,线程是一个独立的执行流,是进程 内部的一个独立执行单元,相当于一个子程序
一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。
操作系统给给个线程分配不停的CPU时间片,在某一时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行。

创建线程有两种方式:
一、创建 java.lang.Thread类的子类。重写该类的run方法
二、创建java.lang.Runnable接口的实现类,实现接口中的run方法

Thread 类中的重要方法:
run方法:包括线程运行时执行的代码,通常在子类中重写它。
start方法:启动一个新的线程,然后虚拟机调用新线程的run方法

Runnable接口中只有一个为实现的Run方法,实现该接口的类必须重写该方法。

Runnable接口与Thread类之间的区别
Runnable接口必须实现run方法,而Thread类中的run方法是一个空方法,可以不重写
Runnable接口的实现类并不是真正的线程类,只是线程运行的目标类。要想一线程的方式执行run方法,必须依靠Thread类。
Runnable接口适合于资源的共享

线程声明周期相关的几个方法:
yeild() 暂停当前正在执行的线程对象,并执行其他线程
sleep() 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响
join()  在一个线程中调用另外的线程的join()方法,将使当前线程阻塞,等待另一个线程执行完后再进入可执行状态。
interrupt() 将借出线程的阻塞状态
isActive() 可以判断当前线程是否处于可运行状态或运行状态

线程通信
这些方法在同步方法中调用
wait():中断方法的执行,使本线程等待,暂时让出cpu的使用权,并允许其他线程使用这个同步方法。
notify():唤醒由于使用这个同步方法而处于等待线程的某一个结束等待
notifyAll():唤醒所有由于使用这个方法而处于等待的线程结束等待

练习:

/**
* 去电影院买票,票五元一张,售票员只有一张5元,张飞有一张20元,排队排在最前面,刘备,关羽排在后面,
* 手里各有一张五元。张飞必须等待。
* */
public class TicketHouse implements Runnable {
    private int fiveCount = 1, tenCount = 0, twentyCount = 0;

    public synchronized void buy() {
        String name = Thread.currentThread().getName();
        // zf:20
        if ("zf".equals(name)) {
            if (fiveCount < 3) {
                try {
                    System.out.println("5元面值数量" + fiveCount + "张,张飞必须等待。");
                    wait();
                    System.out.println("5元面值数量" + fiveCount +"张,卖一张票给张飞,找零15元");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } else if ("gy".equals(name)) {
            fiveCount++;
            System.out.println("卖一张票给关羽,钱正好,5元面值" + fiveCount);
        } else if ("lb".equals(name)) {
            fiveCount++;
            System.out.println("卖一张票给刘备,钱正好,5元面值" + fiveCount);
        }
        if (fiveCount >= 3) {
            notifyAll();
        }
    }

    @Override
    public void run() {
        buy();
    }

    public static void main(String[] args) {
        Runnable runnable = new TicketHouse();
        Thread th1 = new Thread(runnable);
        th1.setName("zf");
        th1.start();

        Thread th2 = new Thread(runnable);
        th2.setName("gy");
        th2.start();

        Thread th3 = new Thread(runnable);
        th3.setName("lb");
        th3.start();
    }
}



10 个回复

倒序浏览
多线程有点难
回复 使用道具 举报

对啊,并且基本上每次面试都会问到多线程相关的知识,一定要跨越这道砍。
回复 使用道具 举报
这个非常有用,感谢楼主的分享了~
回复 使用道具 举报
感觉还没有些难度的,目前我还没有攻破这个坎,预计明天解决吧。
回复 使用道具 举报
学习一下!
回复 使用道具 举报
学习xuel
回复 使用道具 举报
赞赞赞~~~~~~~~~~~~~~~~~~~
回复 使用道具 举报
虽然还没有学,但是顶一个!!!
回复 使用道具 举报
感谢分享,知识属于全人类{:3_46:}
回复 使用道具 举报
先留个名
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马