黑马程序员技术交流社区

标题: 黑马,我在路上之JAVA多线程 [打印本页]

作者: 丰满的理想    时间: 2016-3-30 17:35
标题: 黑马,我在路上之JAVA多线程
黑马,我在路上之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();
    }
}




作者: 沿途的风景    时间: 2016-3-30 17:53
多线程有点难
作者: 丰满的理想    时间: 2016-3-30 18:05
沿途的风景 发表于 2016-3-30 17:53
多线程有点难

对啊,并且基本上每次面试都会问到多线程相关的知识,一定要跨越这道砍。
作者: q312092921    时间: 2016-3-30 18:06
这个非常有用,感谢楼主的分享了~
作者: liusong    时间: 2016-4-30 21:44
感觉还没有些难度的,目前我还没有攻破这个坎,预计明天解决吧。
作者: itheima2016    时间: 2016-4-30 22:00
学习一下!
作者: 拓跋伊祈    时间: 2016-5-1 23:24
学习xuel
作者: liuyu123    时间: 2016-5-1 23:35
赞赞赞~~~~~~~~~~~~~~~~~~~
作者: 我认识你    时间: 2016-5-2 00:43
虽然还没有学,但是顶一个!!!
作者: MasterLHH    时间: 2016-5-2 10:01
感谢分享,知识属于全人类{:3_46:}
作者: 牛凌霄    时间: 2016-5-2 10:26
先留个名




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2