说到线程,我们一定首先想到的是线程的创建,线程的创建一般有两种方式 一种是实现 Runnable 接口,另一种就是 继承 Thread 类 ,因为Java的单继承多实现机制,所以,优先选择 实现 Runnable 接口。
1 package test; 2 3 class ThreadTest extends Thread{ 4 5 public void run(){ 6 7 System.out.println("实现了Thread类"); 8 9 } 10 11 } 12 13 class RunnableTest implements Runnable{ 14 15 public void run(){ 16 17 System.out.println("实现了runnable接口"); 18 19 } 20 21 } 22 23 24 25 public class ThreadStartTest { 26 27 public static void main(String[] args) { 28 29 //直接继承了Thread ,创建一个Thread的实例 30 31 ThreadTest t1 = new ThreadTest(); 32 33 //t1启动 34 35 t1.start(); 36 37 //如果是实现了接口的线程类,需要用对象的实例作为Thread类构造方法的参数 38 39 Thread t2 = new Thread(new RunnableTest()); 40 41 t2.start(); 42 43 } 44 45 }
这儿就有一个我很久之前一直不了解的坑。那时因为不经常使用线程类,所以,对线程的开启仅停留在有两种方式上面。在使用继承的方式时,通过new xxxThread()的方式调用Start()方法,但使用接口的方式时 一直也是new xxxThread()d的方式,发现调不了start()方法,就调用了run()方法。.....其实这样是不对的,对于Java来说,通过new的方式调用内部run()方法一点问题都没有,但并不会开启新线程,那样做只会使用main线程。。正确的方式为Thread t2 = new Thread(new RunnableTest()); 然后调用start()方法。
总之一定要调用start()方法的。
1、那线程开启了就要考虑线程安全了
线程安全,说到底是数据的安全,我可不认识线程是谁,它安不安全,跟我没有半毛钱的关系。但数据不能不安全。这里就要提到内存了,因为,造成数据不安全的就是内存。
对于一个程序来说,就是一个进程,一个线程是其中的一部分。当系统为进程分配空间的时候,就会有公共空间(堆,公共方法区),和栈等。而造成不安全的就是这块公共的内存空间。