zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JAVA线程用法详解

JAVA线程 详解 用法
2023-06-13 09:15:44 时间

本文配合实例较为详细的讲解了Java的线程技术,相信对于深入理解Java程序设计有一定的帮助。具体如下:

很多人在学习JAVA时都对线程都有一定的了解,而当我们开始接触Android开发时,才真真正正的发现了线程是多麽的重要,本文就把对Java线程的用法心得分享给大家,供大家参考。

首先,大家一定要分清线程和进程不是一回事,进程是什么呢?进程就如我们需要执行class文件,而线程才是真正调用CPU资源来运行的。一个class文件一般只有一个进程,但线程可以有很多个,线程的执行是一种异步的执行方式。

一、如何在main函数中再开启一个线程:

示例代码如下:

publicclassThread_one{
publicstaticvoidmain(String[]args){
Runrun=newRun();
//run.run();//此为方法的调用,和线程有着天壤之别
Threadthread=newThread(run);
thread.start();//启动线程,调用线程的run()方法
for(inti=1;i<=20;i++){
System.out.println("主线程i的值:--------"+i);
}
}
}
classRunimplementsRunnable{

@Override
publicvoidrun(){
for(inti=1;i<=20;i++){
System.out.println("子线程i的值:"+i);
}
}
}

二、线程中的sleep方法

示例代码如下:

publicclassThread_sleep{
/*
*线程停顿
*/
publicstaticvoidmain(String[]args){
Runonerun=newRunone();
Threadthread=newThread(run);
thread.start();
try{
Thread.sleep(5000);
thread.interrupt();//中断线程的执行
//thread.stop();//相对中断线程,stop过于粗暴,不建议使用,一般在需要强制关闭子线程时方使用此方法
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
classRunoneimplementsRunnable{
@Override
publicvoidrun(){
for(inti=1;i<10;i++){
try{
Thread.sleep(1000);
System.out.println("-----"+newDate()+"-----");
}catch(InterruptedExceptione){
return;//当捕获到子线程被中断时,直接关闭子线程
}
}
}
}

在这里特别说明一点,thread.interrupt();可以中断线程的执行,相对stop温柔那么一点点,不过还不是最佳的关闭线程的方法,下面就为大家提供一种方式:

publicclassThread_stop{
publicstaticvoidmain(String[]args){
Runthreerun=newRunthree();
Threadth=newThread(run);
th.start();
try{
Thread.sleep(5000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
run.setStop();
}
}
classRunthreeimplementsRunnable{
booleanflag;
@Override
publicvoidrun(){
flag=true;
inti=0;
while(flag){
try{
System.out.println("子线程----"+(i++));
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
publicvoidsetStop(){
flag=false;
}
}

下面就简单给大家介绍一下线程中的合并和让出:

一、如何合并线程,此处调用了join()方法

示例代码如下:

publicclassThread_join{
/*
*合并线程
*/
publicstaticvoidmain(String[]args){
Runtworun=newRuntwo();
Threadthread=newThread(run);
thread.start();
try{
thread.join();//合并线程,此时相当于方法调用
}catch(InterruptedExceptione){
e.printStackTrace();
}
for(inti=0;i<10;i++){
System.out.println("主线程:"+i);
}
}
}
classRuntwoimplementsRunnable{

@Override
publicvoidrun(){
for(inti=0;i<10;i++){
System.out.println("子线程:----"+i);
}
}
}

二、如何让出线程,此处调用了Thread的yield()方法,如下所示:

publicclassThread_yield{

/**让出CPU
*@paramargs
*/
publicstaticvoidmain(String[]args){
Thth=newTh("aaa");
th.start();
for(inti=0;i<=10;i++){
System.out.println("主线程----"+i);
}
}
}
classThextendsThread{
Th(){}
Th(Strings){super(s);}

@Override
publicvoidrun(){
for(inti=0;i<=10;i++){
if(i%3!=0){
System.out.println("子线程"+i);
}else{
System.out.println("子线程i="+i+"线程进行切换");
yield();//从Thread继承方可使用此方法
}
}
}
}

最后和大家分享一下关于线程的优先级的问题,代码如下所示:

publicclassThread_priority{
/*
*priority设置线程的优先级
*Thread默认的优先级为5;Thread的最大优先级为10,最小为0
*/
publicstaticvoidmain(String[]args){
T1t1=newT1();
T2t2=newT2();
t1.start();
//t1.setPriority(Thread.NORM_PRIORITY+3);//设置t1的优先级
t2.start();
}
}
classT1extendsThread{

@Override
publicvoidrun(){
for(inti=0;i<50;i++){
System.out.println("线程T1-----"+i);
}
}
}
classT2extendsThread{

@Override
publicvoidrun(){
for(inti=0;i<50;i++){
System.out.println("线程T2"+i);
}
}
}

相信大家通过以上代码基本已经了解JAVA中的线程机制,希望本文所述对大家深入学习Java程序设计有所帮助。