javaJSE---多线程

一、线程的概念

二、进程与线程

三、线程的状态

四、线程同步

---------------------------------------------------------------------------------------------------------------------------------

一、线程的概念

▪ 程序:Program,是一个指令的集合
▪ 进程:Process,(正在执行中的程序)是一个静态的概念
  进程是程序的一次静态态执行过程, 占用特定的地址空间.
  每个进程都是独立的,由3部分组成cpu,data,code
  缺点:内存的浪费,cpu的负担
▪ 线程:是进程中一个“单一的连续控制流程” (a singlesThread,equential flow of control)/执行路径
  线程又被称为轻量级进程(lightweight process)。
  Threads run at the same time, independently of one another
  一个进程可拥有多个并行的(concurrent)线程
  一个进程中的线程共享相同的内存单元/内存地址空间可以访问相同的变量和对象,而且它们从同一堆中分配对象-->通信、数据交换、同步操作
  由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。

 • Java虚拟机启动的时候会有一个迚程java.exe,该进程中至少有一个线程,在负责java程序的执       行。而且这个线程运行的代码存在亍main方法中,该线程称之为主线程。
• 一个进程中的线程共享代码和数据空间
• 线程结束,进程未毕结束,但进程结束,线程一定结束。
• 进程中包含线程,线程是进程的一部分

二、进程与线程

 JAVA中实现多线程(一)

▪ 在Java中负责线程的这个功能的是Java.lang.Thread 这个类
▪ 可以通过创建 Thread 的实例来创建新的线程。
▪ 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
▪ 通过调用Thead类的start()方法来启动一个线程。

创建线程的方式一>继承Thread类

public class ThreadDemo extends Thread{

    public ThreadDemo(String threadName) {
        super(threadName);
    }

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            System.out.println(Thread.currentThread().getName()+"run()--------"+i);
        }
    }

    public static void main(String[] args) {
        //创建线程对象
        ThreadDemo threadDemo =new ThreadDemo("自定义线程");
        System.out.println(threadDemo.isAlive());
        //启动线程
        threadDemo.start();
        System.out.println(threadDemo.isAlive());
        //        threadDemo.run();
        //获取线程的优先级,一般情况优先级是0-10之间的整数,默认优先级是5,特殊情况下也可以是0-100之间的整数。
//        System.out.println(threadDemo.getPriority());
        //修改优先级为10
//        threadDemo.setPriority(10);
        for (int i = 0; i <10 ; i++) {
            System.out.println(Thread.currentThread().getName()+"main()--------"+i);
        }
        System.out.println(threadDemo.isAlive());
    }
}

创建线程的方式二——>实现Runnable接口

public class RunnableDemo implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <10 ; i++) {
            System.out.println(Thread.currentThread().getName()+"-----------"+i);
        }
    }

    public static void main(String[] args) {
        //创建线程对象
        RunnableDemo runnableDemo =new RunnableDemo();
        //启动线程---使用java中的设计模式(代理模式)
        Thread thread = new Thread(runnableDemo);
        thread.start();

        for (int i = 0; i <10 ; i++) {
            System.out.println(Thread.currentThread().getName()+"-----------"+i);
        }
    }
}

买票RunnableTicket.java

 /**出现的问题:
 *    1、卖票的次序是混乱的;
 *    2、每个窗口不能平均的卖票,分配不均,有些窗口卖了很多票,有些窗口一张票都没卖。这个不符合显示情况。
 *
 */
public class RunnableTicket implements Runnable {
 
    //资源(火车票)
    private int ticket = 10;
 
    @Override
    public void run() {
        for(int i =0; i <100;i++){
            if(ticket > 0){
                System.out.println(Thread.currentThread().getName() + "----------正在卖第" + (ticket--) +"张票!");
            }
        }
    }
 
    public static void main(String[] args) {
        RunnableTicket runnableTicket = new RunnableTicket();
 
        Thread t1 = new Thread(runnableTicket,"1号窗口");
        Thread t2 = new Thread(runnableTicket,"2号窗口");
        Thread t3 = new Thread(runnableTicket,"3号窗口");
        Thread t4 = new Thread(runnableTicket,"4号窗口");
 
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

RunnableTicket2.java

/**
 *出现的问题:
 * 1、卖票的次序是混乱的;
 * 2、每个窗口不能平均的卖票,分配不均,有些窗口卖了很多票,有些窗口一张票都没卖。这个不符合显示情况。
 */
public class RunnableTicket2 implements Runnable {
 
    //资源(火车票)
    private Integer ticket = 10;
 
//    String str = "";
 
    @Override
    public void run() {
        //定义一个共同的锁
        /*
               当多个线程共同访问同一个资源的时候,会出现线程安全问题,此时解决办法之一是加锁,
               在java中要求锁是对象类型,任何对象都是可以的,但是需要保证多个线程访问的是同一把锁。
               程序中锁的名称特别的锁:
               1、锁旗标;
               2、同步监视器;
               3、同步锁;
               4、互斥锁;
               5、对象锁;
               6、锁
               ... ...
         */
//        String str = "";
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (ticket) {
//            synchronized (this){
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "----------正在卖第" + (ticket--) + "张票!");
                }
            }
 
        }
    }
 
    public static void main(String[] args) {
        RunnableTicket2 runnableTicket = new RunnableTicket2();
 
        Thread t1 = new Thread(runnableTicket, "1号窗口");
        Thread t2 = new Thread(runnableTicket, "2号窗口");
        Thread
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值