返回现场笔记
2 分钟阅读

java线程与并发(一)

从操作系统的进程与线程说起,介绍 Java 实现多线程的两种方式:继承 Thread 类与实现 Runnable 接口,并通过示例说明二者在资源共享上的区别。

  • #java
  • #concurrency
  • #thread

  有好几个月没写博客了,各种破事儿忙完,决定继续写博客,恰好最近想了解下有关Java并发的一些知识,所以就准备这一段时间,用零碎的时间多记录一点有关并发的知识。希望这次能一直坚持下去。

想了解并发,必须要先知道一些线程的知识,所以前面几篇还是先写一点Java线程的东西。

什么是线程?这又需要从操作系统说起了。我们在windows中打开任务管理器,就可以查看进程的数量,而一个进程就代表了一个运行的程序。

而在一个进程中,又有很多的线程,他们分管着这个程序的各个小部分。

所以:

  一个进程拥有多个线程

  一个线程只属于一个进程

而在java中实现多线程有两个方式:

一、继承Thread类

二、实现Runnable接口

首先看下Thread类

Thread类在java.lang包中 ,所以不需要刻意的improt,一个类只要继承了这个类,这个类就会成为多线程操作类。

  在Thread类中一定要覆写run()方法,这个方法也是线程的主体

  在主程序中,如果希望run()当中的方法并发调用,需要调用thread类中的start()方法这个方法就是多线程调用run()方法中的代码。如果程序中同一个类多次调用start()方法可能会引发异常。

class MyThread extends Thread{
         private String name;
         public MyThread(String name){
                   this.name=name;
         }
         public void run(){
                   for(int i=0;i<10;i++){
                            System.out.println(name+"线程"+i);
                   }
         }
}
public class MyThreadDemo{
         public static void main(String args[]){
                   MyThread m1=new MyThread("A");
                   MyThread m2=new MyThread("B");
                   m1.start();
                   m2.start();
         }
}

输出:

A run 0
B run 0
A run 1
B run 1
A run 2
B run 2
A run 3
B run 3
A run 4
B run 4
A run 5
B run 5
A run 6
B run 6
A run 7
B run 7
A run 8
B run 8
A run 9
B run 9

再来看下Runnable接口

  在这个接口中只定义了一个方法

  Public void run();

一个类实现了Runnable 接口之后,同样也会成为一个多线程操作类

但是在Runnable接口中没有start()方法,所以如果一个实现了Runnable类的方法如果希望实现多线程操作,需要借助于Thread类

在thread类中有这么一个构造方法

  Public Thread(Runnable target)

MyThread mt=new MyThread("thread1");
Thread t1=new Thread(mt);
t1.start();

由此也可以看出这个Thread类是实现了Runnable接口的类

使用Thread类无法达到资源共享的目的,而使用Runnable接口就可以了。

因为我们可以让一个实现了Runnable接口的类多次被实例化为一个Thread类。

MyThread mt=new MyThread("thread1");
New Thread(mt).run();
New Thread(mt).run();
New Thread(mt).run();

所以Runnable接口比thread类使用的次数更多一点。

总之,在java中通过Thread类或者runnable接口就可以使用多线程编程了。