java线程基础

来源:互联网 发布:怎么加入淘宝充值平台 编辑:程序博客网 时间:2024/06/06 21:00

什么是线程:

说到线程,我们首先需要了解一个概念——进程。几乎所有的操作系统都支持进程这个概念。

进程:就是在某种程度上相互隔离的,独立运行的程序。当一个任务启动时,它可以为即将开始的每一项任务创建一个进程,并允许它们同时执行。当一个程序因为等待网络中的用户输入而被阻塞时,另一个程序还继续运行,这样就增加了资源的利用率。

线程:线程是允许多个活动共存于一个进程中工具。线程也被称为轻量级进程,因为线程只能在单个进程的作用域间活动,所以线程的创建要比进程廉价的多。一个进程中的多个线程可以访问相同的内存地址空间,这就意味着它们可以访问相同的变量可对象,而且它们从一个堆中分配对象。虽然线程带来信息的共享变的更加容易,但是也有可能带来资源的争夺,导致死锁等情况。

为什么要使用线程:

使用线程可以可以解决的问题大体上可以分为两类:“速度”和“设计可管理性”。

"速度"即为提高程序的运行效率,Moore定理已经有些过时了,所以速度的提高是以多核处理器的形式而不是以更快的芯片的形式出现。同样的道理,为了使程序的运行效率更加的高效,所以我们使用线程。

”设计可管理性“即为将把不同的任务交于不同的线程来处理,使得程序设计可以更加的简化。

线程的创建方式:

Thread类

要想创建一个新的线程只需要调用继承Thread类即可。程序员必须重新写Thread的run()方法,来执行我们所需的有效的工作。用户并不需要直接调用该run()方法,而是直接调用start()方法,在Thread内部由start()来自动的调用run()。示例如下:

package basic;import java.util.concurrent.TimeUnit;public class MyThread extends Thread {private int i = 10;public void run(){System.out.println(Thread.currentThread().getName());try {while(i>0){System.out.println("我是第"+i+"条数据...");TimeUnit.MILLISECONDS.sleep(100);i--;}} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {Thread thread1 = new MyThread();thread1.start();Thread thread2 = new MyThread();thread2.start();}}

但是Java语言只能够继承一个父类,所以当你继承了其它类的时候,你就不能使用再继承与Thread类了。因此,java中另一种实现线程的方法即为继承Runnable接口。

Runnable接口

Runnable接口只有一个方法,即为run()方法,所以我们要只需要编写run()方法就可以了,就可以完成我们所要完成的业务逻辑。代码示例如下:

package basic;public class RunThread implements Runnable {private int i = 10;@Overridepublic void run() {System.out.println(Thread.currentThread().getName());while(i>0){System.out.println("我是第"+i+"条数据...");i--;}}public static void main(String[] args) {Thread t1 = new Thread(new RunThread());t1.start();Thread t2 = new Thread(new RunThread());t2.start();}}
Executor

在java SE5的java.util.concurrent包中的执行器(Executor)将为我们管理Thread对象,从而简化了编程。Executor允许管理异步任务的执行,而无需显式的管理线程的生命周期。因此Execuotr在Java SE5/6中是启动任务的优先方法。代码示例如下:

package basic;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Executor允许你管理异步任务的执行,而无需显示的管理线程的生命周期, * Executor在javaSE5/6中是启动任务的优先方法 */public class CachedThreadPool {public static void main(String[] args) {cachedThread();fixedThread();singleThread();}/** * CachedThreadPool将为每个任务都创建一个线程 */public static void cachedThread(){ExecutorService exec = Executors.newCachedThreadPool();for(int i=0; i<5; i++){System.out.println(Thread.currentThread().getName());exec.execute(new RunThread());}exec.shutdown();}/** * FixedThreadPool使用有限的线程集来执行所提交的任务 */public static void fixedThread(){ExecutorService exec = Executors.newFixedThreadPool(5);for(int i=0; i<5; i++){System.out.println(Thread.currentThread().getName());exec.execute(new RunThread());}exec.shutdown();}/** * SingletonThreadExecutor就像是线程数量为1的FixedThreadPool. * 这对于你希望在另一个线程中连续运行的任何事务来说,都是很有用的,假设你有大量的 * 线程,那他们运行的任务将使用文件系统。可以用SingleThreadExecuotr来运行 * 这些线程,以确保任意时刻在任何线程中都只有唯一的任务在运行。 */public static void singleThread(){ExecutorService exec = Executors.newSingleThreadExecutor();for(int i=0; i<5; i++){exec.execute(new RunThread());}exec.shutdown();}}

0 0