java 多线程学*笔记

首先声明这个是粘过来的,是担心链接有一天会失效。。。原链接如下

http://developer.51cto.com/art/200911/162925.htm

http://developer.51cto.com/art/200906/132337.htm

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。任何一个Java程序都必须有一个主线程。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例

用Thread类创建线程

thread类的构造方法有8种

public Thread( );  

public Thread(Runnable target);  

public Thread(String name);  

public Thread(Runnable target, String name);  

public Thread(ThreadGroup group, Runnable target);  

public Thread(ThreadGroup group, String name);  

public Thread(ThreadGroup group, Runnable target, String name);  

public Thread(ThreadGroup group, Runnable target, String name, long stackSize); 

Runnable target

实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。

String name

线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。

ThreadGroup group

当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。

long stackSize

线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB。在x86平台下,默认的线程栈大小是12KB。

一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码

在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性,也就是说可能在run方法执行完后才会执行setName。如果在run方法中要使用线程名,就会出现虽然调用了setName方法,但线程名却未修改的现象

Thread类的start方法不能多次调用,如不能调用两次thread1.start()方法。否则会抛出一个IllegalThreadStateException异常。

使用Runnable接口创建线程

实现Runnable接口的类必须使用Thread类的实例才能创建线程。通过Runnable接口创建线程分为两步:

1. 将实现Runnable接口的类实例化。

2.     建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法。

最后通过Thread类的start方法建立线程。

下面的代码演示了如何使用Runnable接口来创建线程:

package mythread;  

public class MyRunnable implements Runnable  

{  

   public void run()   {  

    System.out.println(Thread.currentThread().getName());  

   }  

  public static void main(String[] args)   {  

    MyRunnable t1 = new MyRunnable();  

    MyRunnable t2 = new MyRunnable();  

    Thread thread1 = new Thread(t1, "MyThread1");  

    Thread thread2 = new Thread(t2);  

    thread2.setName("MyThread2");  

    thread1.start();  

    thread2.start();  

   }

}  

上面代码的运行结果如下:

MyThread1
MyThread2

距离Java多线程的学*又更*一步了。

原文地址:https://www.cnblogs.com/wangfantasy/p/3437962.html