您的位置:首页 > 编程语言 > Java开发

java多线程学习笔记(1)——基本概念介绍

2015-07-24 20:58 543 查看
一、进程与线程的区别

每个进程拥有自己的一整套变量,而线程则共享数据。

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,比如在Windows系统中,一个运行的exe就是一个进程。也就是说应用程序只有运行才能叫进程。进程是程序的动态描述。

线程是指进程中的一个执行流程,线程总是属于某个进程,进程中的多个线程共享进程的内存。一个进程可以有一个或多个线程。

二、java中的多线程

使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。

一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。

Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。

e1:


package thread;

class MyThread extends Thread {

private String name;

public MyThread(String name) {
this.name = name;
}

private int tickets = 5;

@Override
public void run() {
while (tickets > 0) {
tickets--;
System.out.println(this.name + " sold , leave ticket " + tickets);
}
}


}

public class TestThread {

public static void main(String[] args) {

System.out.println("-------------------use thread-----------");
MyThread m1 = new MyThread("t1");
MyThread m2 = new MyThread("t2");
MyThread m3 = new MyThread("t3");

m1.start();
m2.start();
m3.start();

}


}

package thread;

class MyThread2 implements Runnable {

private int tickets = 5;

@Override
public void run() {
while (tickets > 0) {
tickets--;
System.out.println(Thread.currentThread().getName()
+ " sold , leave ticket " + tickets);
}
}
}

public class TestRunnable {

public static void main(String[] args) {

System.out.println("use runnable--------------");

MyThread2 my2 = new MyThread2();
Thread t1 = new Thread(my2, "t1");
Thread t2 = new Thread(my2, "t2");
Thread t3 = new Thread(my2, "t3");
t1.start();
t2.start();
t3.start();
}

}


三、大多数情况下使用接口 Runnable接口实现线程创建

public interface Runnable Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。

设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了 Runnable。激活的意思是说某个线程已启动并且尚未停止。

此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。

四、sleep方法

API介绍

public static void sleep (long millis, int nanos) throws InterruptedException

在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。

参数:

millis - 以毫秒为单位的休眠时间。

nanos - 要休眠的另外 0-999999 纳秒。

抛出:

IllegalArgumentException - 如果 millis 值为负或 nanos 值不在 0-999999 范围内。

InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。

另请参见:

Object.notify()

e1: sleep()方法

for (int i = 0; i < 100; i++) {
System.out.println("sleep!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


注:

不要调用Thread类Runnable对象的run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start方法。这个方法将创建一个执行run方法的新线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: