Java多线程是核心Java的重要构成部分之一。很多时候,我们需要接受多种任务并及时给予处理,这实际上就是一种并发性行为。而Java多线程就可以很好地实现这种并发性行为。本文就是探讨Java的多线程内容,包括线程是什么?如何创建线程?如何应用线程?线程之间的状态如何转换?等。
线程,是操作系统里面一个很重要的概念。说到线程,就有必要提及进程。那么什么是进程呢?什么又是线程呢?进程与线程之间有何差异呢?进程是具有一定独立功能的程序关于某个数据集合的一次运行活动,它是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,并且它基本上不拥有系统资源,只拥有一点在运行中比不可少的资源,但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。简而言之,一个程序至少有一个进程,一个进程至少有一个线程。进程和线程的主要差别在于他们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
Java中创建线程:
方法一,设计一个java.lang.Thread类的子类,覆盖Thread类的run()方法,然后创建该类的实例。
方法二,设计一个实现Runnable接口的类,实现它的run()方法,然后把这个类的实例作为Thread的构造器的参数,创建Thread类的实例。
Java中启动线程:
通过调用start ()方法启动线程。
Java中运行线程:
JVM自动调用sun()方法执行线程。
为了理解这两种创建线程的方法,请阅读如下代码。
代码一:
package com.jieke.thread;
/**
* Description:利用方法一创建线程
* @author Wang Luqing
* @version 1.0
*/
public class SubThread extends Thread
{
String str = "好好学习,天天向上。";
public void run()
{
for (int i=0;i<2;i++)
{
try
{
Thread.sleep(100);//休眠100毫秒
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+str);
}
}
public static void main(String[] args)
{
SubThread t1=new SubThread();
t1.start();
}
}
代码二:
package com.jieke.thread;
/**
* Description:利用方法二创建线程
* @author Wang Luqing
* @version 1.0
*/
public class SubRunnable implements Runnable
{
String str = "好好学习,天天向上。";
public void run()
{
for (int i=0;i<2;i++)
{
try
{
Thread.sleep(100);//休眠100毫秒
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+str);
}
}
public static void main(String[] args)
{
SubRunnable sr=new SubRunnable();
Thread t1 = new Thread(sr);
t1.start();
}
}
代码一和代码二,针对相同的问题,采用不同地创建线程的方法来求解问题。
关于如何应用Java多线程,首先要分析问题是否具有多线程需求,接下来就是创建多线程和调配多线程工作关系,让多线程能够协同工作,既提高工作效率,又保持正确的工作逻辑。Java的多线程应用很是广泛,毕竟现实生活中的很多问题都具备多线程需求,因而,在解决此类问题的时候,要格外注意多线程之间的协调和关联。
线程之间的状态由创建、就绪、运行、阻塞和死亡5个状态构成。
创建状态:使用new运算符创建一个线程后,该线程处于创建状态。
就绪状态:用start()方法启动一个线程后,系统为该线程分配除处理机外的所有资源,线程就进入就绪队列排队,等待处理机制调度。
运行状态:轮到线程占用CPU资源时,JVM将CPU使用权切换给该线程,该线程就可以开始自己的生命周期。
阻塞状态:正在运行的线程让出CPU使用权,JVM将CPU资源切换给其它线程。阻塞主要有休眠阻塞、等待阻塞、互斥阻塞和其它阻塞等。
死亡状态:线程运行结束后进入死亡状态。
总结:
1)利用Java多线程机制时,一要注意多线程特性,二要清楚业务逻辑。
2)Java多线程实际应用时,具有线程各个状态以及状态的变迁,从而确保在合适的状态完成合适的事务。