多线程

线程的定义

程序是指在电脑上运行的一个代码合集,而进程是程序的一部分,是正在运行的程序;线程则是进程中的单一的连续控制流程,就像是进程一个分支,解决一个问题的好多种方法或者说是通道之一,一个进程可以有很多同时进行的线程,线程结束进程比一定结束,而进程结束线程一定结束。
用star()方法来启动线程,main()方法是主线程。
线程的例子:

public class a {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("子线程");

            }
        });

        thread.start();
        System.out.println("主线程");

    }

}

运行结果:
主线程
子线程


返例:

public class b {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("子线程");

            }
        });

        thread.run();
        System.out.println("主线程");
    }

}

运行结果:
子线程
主线程


线程的启动要用.start()方法,而不是调用run()方法。


实现线程我们一般都会用上面的方法实现Runable接口,还有一种实现线程的方法就是继承Thread类、重写run()方法,然后实例化类、对象.start()来启动线程。
例:

public class C extends Thread{
    @Override
    public void run(){
        System.out.println("子线程");
    }
    public static void main(String[] args) {
        System.out.println("主线程");
        C c = new C();
        c.start();


    }
}

多线程

一个进程下可以有好多的进程,而好多进程同时进行就是多线程,多个线程同时进行,那么到底是谁先执行谁后执行,这个取决于CPU的调度。
让我们来实现一个模拟5个售票窗口同时卖5张火车票的情景。
例:

public class A implements Runnable {
    private int num = 5;
    private int count = 100;

    @Override
    public void run() {
        while (count > 0) {
            if (num > 0) {
                System.out.println(Thread.currentThread().getName()+"正在出售"+(num--)+"张票");
                count--;

            }
        }

    }

}
public class TestA {
    public static void main(String[] args) {
        A a = new A();
        Thread thread = new Thread(a);
        Thread thread2 = new Thread(a);
        Thread thread3 = new Thread(a);
        Thread thread4 = new Thread(a);
        thread.start();
        thread2.start();
        thread3.start();
        thread4.start();



    }

}

运行结果:
这里写图片描述
多个线程同时进行就可能出现这种情况,线程0和线程4同时卖掉了第4张票;这就是资源共享时出现的资源分配不均,那么怎么样才能解决这种情况呢,就是加同步代码块或者是给run()方法用同步修饰符(synchronized)修饰。

public class A implements Runnable {
    private int num = 5;
    private int count = 100;

    @Override
    public void run() {
        while (count > 0) {

            synchronized (this) {

                if (num > 0) {
                    System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "张票");
                    count--;

                }
            }

        }

    }

}

public class TestA {
    public static void main(String[] args) {
        A a = new A();
        Thread thread = new Thread(a);
        Thread thread2 = new Thread(a);
        Thread thread3 = new Thread(a);
        Thread thread4 = new Thread(a);
        thread.start();
        thread2.start();
        thread3.start();
        thread4.start();



    }

}

输出结果:
这里写图片描述

或者是给Run()方法加修饰符

public class A implements Runnable {
    private int num = 5;
    private int count = 100;

    @Override
    public synchronized void run() {
        while (count > 0) {



                if (num > 0) {
                    System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "张票");
                    count--;

                }


        }

    }

}

运行结果和上面一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值