Java基础,线程创建的三种方法,浅谈线程

一、线程(Thread)

        线程要在进程中运行,进程的结束,那线程也就结束。下面的QQ浏览器就是一个进程,而打开的一个个网页则是线程,如果只打开了一个网页就相当于单线程。了解了线程及进程,下面我们来看看

            创建多线程的方式有三种:
                1、继承Thread类,重写run方法:

public class TheadCreate extends Thread { //继承Thead类来创建

    //重写run方法,run方法是执行里面的内容

    @Override
    public void run() {
        System.out.println("这是线程创建的第一个方法");
    }

    public static void main(String[] args) {
        new TheadCreate().start();// 创建并启用线程

        TheadCreate tc = new TheadCreate();
        Thread thread = new Thread(tc);
        thread.start();

    }
}

main方法中有两种方法来启动线程,如果只执行第一个start()方法为单线程,执行整个main方法为多线程。

                2、实现Runnable的接口,重写run方法:

public class ThreadCreate2 implements Runnable {// 实现Runnable接口创建线程
    @Override
    public void run() {
        System.out.println("重写run方法来创建接口");
    }

    public static void main(String[] args) {
        ThreadCreate2 t2 = new ThreadCreate2();
        Thread t = new Thread(t2);
        t.start();
    }
}

                3、第三种很少用,直接上代码:

import java.util.concurrent.*;

public class ThreadCreate3 implements Callable {
    @Override
    public Object call() throws Exception {
        Integer result = 10;
        for (;result>0;result--){
            System.out.println("第三种线程创建执行了"+result+"次");
        }
        return result;
    }

    public static void main(String[] args) {
        ThreadCreate3 t3 = new ThreadCreate3();

        // 线程任务
        FutureTask<Integer> ft = new FutureTask<>(t3);

        // 线程池来执行
        ExecutorService es = Executors.newFixedThreadPool(2);
        // 提交
        es.submit(ft);
        try {
            System.out.println(ft.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

这就是三种线程的创建。

        线程问题解决了,那就有一种问题,就是线程的并发和并行,来看下面的这张图:

 并行就是在这个一时刻,同时发生。

并发就是在这一时间段发生的。通俗点讲,双十一淘宝抢购00:00:00时到00:30:00中来打折商品,那么在这个时间段登录淘宝的人就是并发,那登录的人就相当于线程,淘宝的运行,相当于进程。

说说代码问题,run方法是执行run中的内容;start()则是启动线程。

下面是一个火车票的练习:

 首先来看题,设置一个总票数,总票数自己定,有三个窗口,这三个窗口相当于线程,直接上代码:

public class TrainTicket implements Runnable {
    // 设置票数为100
    static int ticket = 30;
    // 创建对象
    static Object oj = new Object();

    @Override
    public void run() {
        for (;;){
            try {
                Thread.sleep(1000); //线程睡眠1秒
                synchronized (oj) { //线程锁,里面所包裹的则是同步代码
                    if (ticket > 0) {
                        // Thread.currentThread().getName() 为得到线程的名字
                        System.out.println(Thread.currentThread().getName() + "正在出票,票号为" + ticket--);
                    } else {
                        System.out.println("票已售完!");
                        System.exit(0); //结束进程
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    public static void main(String[] args) {
        TrainTicket tt = new TrainTicket();
        Thread t = new Thread(tt);
        Thread t1 = new Thread(tt);
        Thread t2 = new Thread(tt);
        // 给线程起一个名字
        t.setName("第一窗口");
        t1.setName("第二窗口");
        t2.setName("第三窗口");
        // 启动三个线程
        t.start();
        t1.start();
        t2.start();
    }
}

好啦,今天的线程就先到这里啦,如果有什么讲的不对的地方大家多多提提意见。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值