基础篇二

前面这部分内容虽然比较简单,但是这些内容是在一般的教科书上无法看到的,所以我们还是需要花一些时间好好消化这些知识。
关于线程的运行方式,我们可以分为并行和并发两种,这两种运行方式取决于计算机硬件配置,如果您的计算机只有一个CPU,那么计算机中的线程必定是并发方式运行,即众多线程通过获得CPU的时间片来获得运行的权利,一旦时间片结束,线程便暂停运行,由于CPU时间片极短,线程快速的交替运行,所以在使用者看来,类似于多个线程同时运行。
而假如您的计算机比较高端,拥有两个或两个以上的CPU(这和CPU多核是截然不同的概念, 一个CPU在一个时刻只能处理一个线程),那么您的计算机就可以同时运行和CPU数目相同的线程,这种就叫并行。
为了更好地区别和理解并行和并发,我们举个例子。假如一个大人就是一个CPU,一个孩子就是一个线程,并发,就像一个大人喂2个孩子,轮换着每人喂一口,表面上两个孩子都在吃饭,其实吃饭这个动作时交替进行的。而并行,就是2个大人喂2个孩子,两个孩子也同时在吃饭。
关于线程和线程对象,我们现在如果还不是很理解也没有太大关系,在高级篇中会有更深入的讲解,现在只要知道二者最基本的区别即可。
join方法的作用,文中讲述的非常清楚:a.join() ,就是让当前正在执行的线程等待线程对象a对应的线程运行完成后才继续运行。使用这个方法我们可以在一定程度上控制一些线程的运行情况。
创建线程的两种不同方式,相信大家都已经非常清楚,这个不需要多说了,就是继承和实现接口两种方式,然后调用start方法启动。下面这个例子可以帮助我们理解两种不同方式创建线程的区别:

采用继承方式:
class MyThread extends Thread{
public int x = 0;
public void run(){
for(int i = 0;i<100 ; i++){
try{
Thread.sleep(10);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(x++);
}
}
}
public class Test{
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
mt.start();
mt.join();
MyThread mt1 = new MyThread();
mt1.start();
}
}
输出结果为:
0
1


99
0
1


99

采用实现接口方式:
class MyThread implements Runnable{
public int x = 0;
public void run(){
for(int i = 0;i<100 ; i++){
try{
Thread.sleep(10);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(x++);
}
}
}
public class Test{
public static void main(String[] args) throws Exception {
Runnable r = new MyThread();
Thread t = new Thread(r);
t.start();
t.join();
Thread t1 = new Thread(r);
t1.start();
}
}
输出结果为:
0
1


198
199

相信大家都已经看到了有什么样的不同,虽然两个程序中我们都是启动了两个线程,但是,对于第一个程序来说,我们直接创建的是自定义线程类的对象,因此我们创建了两个对象,他们各自使用本对象内部的资源。而第二个程序中,MyThread只有一个对象r,两个对象t和t1都是对r的封装而已,操作的都是r中的资源,所以,两个线程都是对x进行操作,相当于自加了200次。
很显然,继承方式比实现接口方式在创建对象时更简单,但是在多线程编程中,如果需要实现多个线程操作同一个对象或变量,我们只能通过定义有参的构造器,将需要共同使用的对象或变量传入到线程对象中,稍显复杂。实现接口方式则刚好相反,它在创建线程时显得复杂一点,需要对Runnable实例进行包装才能调用start方法,但是在多线程编程中它却有先天的优势,我们可以基于同一个Runnable实例创建任意多个线程(线程池,后面会有专门讲解本知识点的章节),它们共同拥有Runnable实例中的变量。此外,由于实现接口方式时我们还可以继承别的类,显得更加灵活。二者没有绝对的好与不好,所以在编程时,要看个人习惯,二者可以通过不同的方式实现相同的作用,希望大家能够至少掌握其中一种。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值