JAVA多线程编程(小白)

多线程技术

线程与进程

进程是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间。

线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程。
线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。

JAVA 创建线程

方法一、 继承Thread创建线程
直接上代码:

public class MyThread extends Thread{
    /**
     * run方法就是线程要执行的任务方法
     */
    @Override
    public void run() {
        //这里的代码就是一条新的执行路径
        //这个执行路径的触发方法,不是调用run方法,而是通过thread对象的start()方法在执行(在main方法中演示)
        for(int i = 0;i<5;i++){
        //随便执行一个任务
            System.out.println("黑云压城城欲摧"+i);
        }
    }
}

创建一个继承线程Tread类的子类MyTread,编写run方法(IDEA中就提示)。

下面在main方法中调用刚创建的线程

public class 继承Thread {
    public static void main(String[] args) {
    	//创建一个MyThread的对象,用于调用线程。
        MyThread myThread = new MyThread();
        //执行线程中的run任务方法,注意使用start()方法调用而不是run()
        myThread.start();
        //主线程中随便编写一个任务,用于观察两个线程的执行顺序
        for(int i = 0;i<5;i++){
            System.out.println("甲光向日金鳞开"+i);
        }
    }
}

运行结果:

甲光向日金鳞开0
黑云压城城欲摧0
甲光向日金鳞开1
黑云压城城欲摧1
甲光向日金鳞开2
黑云压城城欲摧2
黑云压城城欲摧3
黑云压城城欲摧4
甲光向日金鳞开3
甲光向日金鳞开4

Process finished with exit code 0

因为JAVA中,各线程之间采用抢占式调度。所以每次运行结果会出现异同,但可以看出主线程和myThread线程之间并发执行。

方法二、 实现Runnable方法创建线程

 * 实现runable与继承thread相比有如下优势:
 * 1.通过创建任务给线程分配的方式来实现多线程,更适合多个线程同时执行相同任务的情况
 * 2.可以避免单继承所带来的局限性
 * 3.任务与线程分离,提高程序的健壮性
 * 4.后续学习的线程池中,接收runable类型的任务,而不接收thread类型的线程。

直接上代码

public class MyRunable implements Runnable{
    /**
     * 用于给线程执行的任务
     */
    @Override
    public void run() {
        for(int i = 0;i<5;i++){
            System.out.println("角声满天秋色里"+i);
        }
    }
}

Runable是接口方法,创建一个MyRunable实现Runable接口后,也要编写一段run任务方法。
下面是main方法中调用MyRunable

 public static void main(String[] args) {
        //创建一个任务对象
        MyRunable myRunable = new MyRunable();
        //创建一个线程并给它myRunable的任务
        Thread thread = new Thread(myRunable);
        thread.start();
        for(int i = 0;i<5;i++){
            System.out.println("塞上燕脂凝夜紫"+i);
        }
    }

运行结果

塞上燕脂凝夜紫0
角声满天秋色里0
塞上燕脂凝夜紫1
角声满天秋色里1
塞上燕脂凝夜紫2
角声满天秋色里2
塞上燕脂凝夜紫3
角声满天秋色里3
塞上燕脂凝夜紫4
角声满天秋色里4

方法三、带返回值的线程Callable(不常用)
上代码

    static class MyCallable implements Callable<Integer>{
		//值对返回值为Integer型
        @Override
        public Integer call() throws Exception {
            for (int i = 0;i<5;i++){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(i);
            }
            //返回值为100
            return 100;
        }
    }

在main方法中调用MyCallable

public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable callable = new MyCallable();
        FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
        new Thread(futureTask).start();
        //获取子线程 MyCallables的返回值
        //主线程会在子线程get()结束后才执行
        int c = futureTask.get();
        System.out.println("子线程的返回值为:"+c);
        for (int i = 0;i<4;i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i);
        }

    }

运行结果

0
1
2
3
4
子线程的返回值为:100
0
1
2
3

Process finished with exit code 0

以上就是JAVA线程中创建线程的方法,最常用的是Runable接口创建线程任务。本人还是JAVA初学者,刚开始尝试写博客,如有问题,还请大家多多指定,十分感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值