「java的线程技术」java线程的三种方式

博主:adminadmin 2023-03-17 06:25:07 434

本篇文章给大家谈谈java的线程技术,以及java线程的三种方式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

什么是JAVA的多线程?

一、 什么是多线程:

我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。

多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源)

多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源;

主线程:在进程中至少存在一个主线程,其他子线程都由主线程开启,主线程不一定在其他线程结束后结束,有可能在其他线程结束前结束。Java中的主线程是main线程,是Java的main函数;

二、 Java中实现多线程的方式:

继承Thread类来实现多线程:

当我们自定义的类继承Thread类后,该类就为一个线程类,该类为一个独立的执行单元,线程代码必须编写在run()方法中,run方法是由Thread类定义,我们自己写的线程类必须重写run方法。

run方法中定义的代码为线程代码,但run方法不能直接调用,如果直接调用并没有开启新的线程而是将run方法交给调用的线程执行

要开启新的线程需要调用Thread类的start()方法,该方法自动开启一个新的线程并自动执行run方法中的内容

结果:

java多线程的启动顺序不一定是线程执行的顺序,各个线程之间是抢占CPU资源执行的,所有有可能出现与启动顺序不一致的情况。

CPU的调用策略:

如何使用CPU资源是由操作系统来决定的,但操作系统只能决定CPU的使用策略不能控制实际获得CPU执行权的程序。

线程执行有两种方式:

1.抢占式:

目前PC机中使用最多的一种方式,线程抢占CPU的执行权,当一个线程抢到CPU的资源后并不是一直执行到此线程执行结束,而是执行一个时间片后让出CPU资源,此时同其他线程再次抢占CPU资源获得执行权。

2.轮循式;

每个线程执行固定的时间片后让出CPU资源,以此循环执行每个线程执行相同的时间片后让出CPU资源交给下一个线程执行。

希望对您有所帮助!~

java线程是什么

一、操作系统中线程和进程的概念

现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。

“同时”执行是人的感觉,在线程之间实际上轮换执行。

二、Java中的线程

在Java中,“线程”指两件不同的事情:

1、java.lang.Thread类的一个实例;

2、线程的执行。

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

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

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

一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。

一旦创建一个新的线程,就产生一个新的调用栈。

线程总体分两类:用户线程和守候线程。

当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM,守候线程一般是由操作系统或者用户自己创建的

java中什么叫做线程?什么叫多线程?多线程的特点是什么

1、在 Java 中,线程是一个独立的执行路径。换句话说,一个线程是一个程序中的单独的执行环境,它可以并行地运行和其他线程。

2、多线程指的是在一个程序中,有多个线程在并行地运行。

3、多线程的一个特点是它们可以共享程序的资源,这样可以更有效地利用程序的资源,例如处理器时间和内存。此外,多线程还可以使程序更响应,因为在一个线程中运行的任务可以在另一个线程中进行,而不会导致程序“假死”。

java有几种实现线程的方式?

有三种:

(1)继承Thread类,重写run函数

创建:class xx extends Thread{ public void run(){Thread.sleep(1000)//线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源}}

开启线程:对象.start()//启动线程,run函数运行

(2)实现Runnable接口,重写run函数

开启线程:Thread t = new Thread(对象)//创建线程对象t.start()

(3)实现Callable接口,重写call函数

Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

Java线程的概念与原理

一 操作系统中线程和进程的概念

现在的操作系统是多任务操作系统 多线程是实现多任务的一种方式

进程是指一个内存中运行的应用程序 每个进程都有自己独立的一块内存空间 一个进程中可以启动多个线程 比如在Windows系统中 一个运行的exe就是一个进程 线程是指进程中的一个执行流程 一个进程中可以运行多个线程 比如java exe进程中可以运行很多线程 线程总是属于某个进程 进程中的多个线程共享进程的内存 同时 执行是人的感觉 在线程之间实际上轮换执行

二 Java中的线程

在Java中 线程 指两件不同的事情

java lang Thread类的一个实例

线程的执行

使用java lang Thread类或者java lang Runnable接口编写代码来定义 实例化和启动新线程 一个Thread类实例只是一个对象 像Java中的任何其他对象一样 具有变量和方法 生死于堆上 Java中 每个线程都有一个调用栈 即使不在程序中创建任何新的线程 线程也在后台运行着 一个Java应用总是从main()方法开始运行 mian()方法运行在一个线程内 它被称为主线程 一旦创建一个新的线程 就产生一个新的调用栈 线程总体分两类 用户线程和守候线程

当所有用户线程执行完毕的时候 JVM自动关闭 但是守候线程却不独立于JVM 守候线程一般是由操作系统或者用户自己创建的

———————————MultiT java——————————————————————

class MultiThread

{

public static void main(String[] args)

{

MyThread mt=new MyThread();

//mt setDaemon(true);//设定为后台线程 main进程结束时 后台进程也跟着结束

//mt setPriority(Thread MAX_PRIORITY); //设定线程优先级 MAX_PRIORITY为 MIN_PRIORITY为 NORM_PRIORITY为

//设定为最高优先级后 程序运行时 mt线程一直运行 强制终止时 main线程才运行

//设定为最高优先级的线程 无论有无yield(); 线程总一直运行 直到强制终止时 main和mt线程交替运行

mt start();

int index= ;

while(true) //显示结果与教程不同

{

if(index++== )

break;

System out println( main: +Thread currentThread() getName()); //获取线程名字

}

}

}

class MyThread extends Thread

{

public void run()

{

while(true)

{

System out println(getName());

yield(); //允许当前线程停止 转去执行其他线程 静态方法

//mt进程执行时 切换到main进程 main进程执行一段时间后

//切换进程到mt mt执行完获取名字后 返回到main进程

}

}

}

//一个长时间处于等待状态的线程也有可能被线程调度器调度 从而运行

//打破高优先级线程始终获有运行时间的状态

——————————————————————————————————————

——————————MultiThread java———————————————————————

class MultiThread

{

public static void main(String[] args)

{

MyThread mt=new MyThread();

//new Thread(mt) start();   //创建多个同样的线程访问同一个变量index 若MyThread采用继承Thread方式 则无法共享同一个变量

//new Thread(mt) start();

//new Thread(mt) start();

//new Thread(mt) start();

mt getThread() start(); //也可以采用内部类的方式共享访问同一个变量

mt getThread() start();

mt getThread() start();

mt getThread() start();

//mt setDaemon(true);//设定为后台线程 main进程结束时 后台进程也跟着结束

//mt setPriority(Thread MAX_PRIORITY); //设定线程优先级 MAX_PRIORITY为 MIN_PRIORITY为 NORM_PRIORITY为

//设定为最高优先级后 程序运行时 mt线程一直运行 强制终止时 main线程才运行

//设定为最高优先级的线程 无论有无yield(); 线程总一直运行 直到强制终止时 main和mt线程交替运行

//mt start();

int index= ;

while(true) //显示结果与教程不同

{

// if(index++== )

//   break;

System out println( main: +Thread currentThread() getName()); //获取线程名字

}

}

}

class MyThread //implements Runnable //extends Thread //使用外部类的方式

//使用内部类完成使用Runnable接口才能完成的两个功能 a 创建多个线程 b 访问同一个变量

{

int index= ;

private class InnerThread extends Thread //不想让外部访问其实现方法 加上private

{

public void run()

{

while(true)

{

System out println(Thread currentThread() getName()+ : +index++);

}

}

}

Thread getThread()

{

return new InnerThread();

}

/*

public void run()

{

while(true)

{

System out println(Thread currentThread() getName()+ : +index++);

//yield(); //允许当前线程停止 转去执行其他线程 静态方法

//mt进程执行时 切换到main进程 main进程执行一段时间后

//切换进程到mt mt执行完获取名字后 返回到main进程

}

}

*/

}

//一个长时间处于等待状态的线程也有可能被线程调度器调度 从而运行

//打破高优先级线程始终获有运行时间的状态

//如果不需要修改Thread类的除了run方法外的其他方法 选用implements Runnable

———————————————————————————————————————

———————————TicketsSystem java———————————————————

//多线程实现火车票的售票系统 用同步块 或著同步方法

class TicketsSystem

{

public static void main(String[] args)    //运行结果与教程中不同 不完全顺序 每次运行 顺序都不完全一样

{

SellThread st=new SellThread();//创建四个线程访问同一变量tickets

// 错 SellThread st =new SellThread();//若采用创建四个对象的方式 则每个对象中都有 张票

new Thread(st) start();    //b为false 用的同步方法    | //同步方法与同步块共用中 显示的是只调用了同步块 而同步方法未被调用

//b为true 用的同步块      | //原因 启动第一个线程后 CPU时间片没有到期 线程没有立即运行 接着执行b=true

//               | //解决办法 启动第一个线程后 执行一个睡眠时间 让CPU时间片到期

try

{

Thread sleep( );

}

catch(Exception e)

{

e printStackTrace();

}

st b=true;

new Thread(st) start();

//new Thread(st) start();

//new Thread(st) start();

}

}

class SellThread implements Runnable   //程序有点小问题 当剩下最后一张票时 四个线程都运行 可能会出现票数为 (系统长时间运行时)

//可加上一个静态方法sleep();它会抛出异常

{

int tickets= ;

//Object obj=new Object();//也可以声明一个Thread对象

Thread th=new Thread();

boolean b=false;

public void run()

{

if(b==false)

{

while(true)

sell();

}

else

{

while(true)

{            //同步方法利用的是this所代表的对象的锁

synchronized(this) //采用同步后 显示正确 此方法两步 声明Thread对象 用synchronized把原方法括起来

{            //这里换th为this

///*

if(tickets )

{

try

{

Thread sleep( );

}

catch(Exception e)

{

e printStackTrace();

}

System out println( th +Thread currentThread() getName()+ sell tickets: +tickets);

tickets ;

}

//*/

}

}

}

}

public synchronized void sell() //每个class也有一个锁 是这个class所对应的class对象的锁(监视器)

{

if(tickets )

{

try

{

Thread sleep( );

}

catch(Exception e)

{

e printStackTrace();

}

System out println( sell +Thread currentThread() getName()+ sell tickets: +tickets);

tickets ;

}

}

}

————————————————————————————————————————

———————————TestWN java————————————————————

class Test

{

public static void main(String[] args)

{

Queue q=new Queue();

Producer p=new Producer(q);

Consumer c=new Consumer(q);

p start();

c start();

}

}

class Producer extends Thread

{

Queue q;

Producer(Queue q)

{

this q=q;

}

public void run()

{

for(int i= ;i ;i++)

{

q put(i);

System out println( Producer put: +i);

}

}

}

class Consumer extends Thread

{

Queue q;

Consumer(Queue q)

{

this q=q;

}

public void run()

{

while(true)

{

System out println( Consumer get: +q get());

}

}

}

class Queue   //wait notify 方法必须用在同步方法中 要加上关键字synchronized

{

int value;

boolean bFull=false;

public synchronized void put(int i)

{

if(!bFull)

{

value=i;

bFull=true;

notify();

}

try

{

wait();

}

catch(Exception e)

{

e printStackTrace();

}

}

public synchronized int get()

{

if(!bFull)

{

try

{

wait();

}

catch(Exception e)

{

e printStackTrace();

}

}

bFull=false;

notify();

return value;

}

}

————————————————————————————————————

————————————TestThread java———————————————————————

class TestThread

{

public static void main(String[] args)

{

Thread t =new Thread ();

t start();

int index= ;

while(true)

{

if(index++== )

{

t stopThread();

t interrupt(); //让线程 终止

break;

}

System out println(Thread currentThread() getName());

}

System out println( main() exit );

}

}

class Thread extends Thread

{

private boolean bStop=false;

public synchronized void run()

{

while(!bStop)

{

try

{

wait(); //加入wait后 main线程结束时 程序还未终止 原因是Thread 的线程调用wait方法 进入对象的等待队列中 需要notify方法将它唤醒

}

catch(Exception e)

{

//e printStackTrace();

if(bStop)

return;

}

System out println(getName());

}

}

public void stopThread()

{

bStop=true;

}

}

lishixinzhi/Article/program/Java/gj/201311/27407

关于java的线程技术和java线程的三种方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。