java线程简介(1)

源地址 http://www.journaldev.com/1016/java-thread-example  作者 Pankaj 


 欢迎来学习Java 线程的例子,进程和线程是两基本的单元被执行,相比较来说在并发程序中更多的是关注的JAVA线程。

   进程
一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用,在一个程序中包含多个进程。JAVA运行环境中作为一个进程包含不同的类和程序流程。
   线程
线程可以被叫做轻量级的进程,线程需要更少的资源来创建和存在在这个过程中,线程共享进程的资源。 每个java应用程序有至少一个线程-(main方法主线程),虽然在后台有很多其它java 线程运行例如内存管理,系统管理和单进程等,但是对于应用程序来说-主线程是第一个Java线程并且我们在其中可以创建多线程。多线程是指两个或多个线程同时执行在一个程序中,在单核处理器的计算机中一次只能执行一个线程,操作系统中存在一个“时间切片” 特性用于切分处理器时间在不同的进程和线程中。
Java线程的优势
1.Java线程是轻量级的相比进程来说,当创建一个线程是可以花费少的时间和资源。
2.线程共享它们父进程的数据和代码。
3.上下文切换中通常线程比进程代价更少。
4.线程的内部通讯中是相对容易的比进程通讯。
Java提供两种方式编写创建线程
1.实现 the java.lang.Runnable 接口.

确保这个类是可以运行的,我们可以实现java.lang.Runnable中的public void run()方法,为了使得类作为一个线程,我们需要创建一个线程对象,通过这个实例化的对象,然后调用start()方法为了来执行run()方法在一个单独的线程中。
这是一个 java thread 举例 通过实现 Runnable 接口.

package com.journaldev.threads;

public class HeavyWorkRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }

}

2.继承 the java.lang.Thread 类.
我们能够继承java.lang.Thread类为了创建我们自己java线程类并且重写run()方法,同时我们能够创建这个对象和调用start()方法为了执行我们自定义的java线程类run()方法。

这是一个 java thread 举例说明了如何继承Thread类

package com.journaldev.threads;

public class MyThread extends Thread {

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("MyThread - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("MyThread - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }
    
}

这是一个测试程序说明了如何创建一个java线程和如何执行它,
package com.journaldev.threads;
	public class ThreadRunExample {
	    public static void main(String[] args){
	        Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
	        Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
	        System.out.println("Starting Runnable threads");
	        t1.start();
	        t2.start();
	        System.out.println("Runnable Threads has been started");
	        Thread t3 = new MyThread("t3");
	        Thread t4 = new MyThread("t4");
	        System.out.println("Starting MyThreads");
	        t3.start();
	        t4.start();
	        System.out.println("MyThreads has been started");	 
	    }
	}
以上java线程示例程序的输出是
Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1
一旦我们开始执行任何线程,它的执行取决于操作系统实现的时间切片和我们不能控制其执行,然而我们甚至可以设置线程的优先级,但它并不能保证高优先级的线程会被首先执行。
Runnable 与 Thread比较
如果你的类提供了更多的功能,而不只是运行线程,作为线程你应该实现Runnable接口为了提供一个方式运行它,如果你的类的唯一目标是运行线程,线程可以继承Thread类。实现Runnable是首选的,因为java支持实现多个接口。如果你继承了线程类,你不能继承其他类。
提示:
当你已经注意到,线程不会返回任何值,但如果我们希望我们的线程来做一些处理,然后返回结果我们的客户端程序,请查看 Java Callable Future.
更新:
从Java 8起,Runnable 是一个功能接口,我们可以使用lambda表达式它提供了实现方式,而不是使用匿名类,更详细的内容请查看  Java 8 Functional Interfaces.
 
 

你可能感兴趣的:(MultiThreading,and,Concurrency)