「java程序设计多线程」java 实现多线程

博主:adminadmin 2022-12-23 20:48:07 62

本篇文章给大家谈谈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 程序如何编写?

Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

新建状态:

使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

就绪状态:

当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

运行状态:

如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

阻塞状态:

如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

死亡状态:

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

北大青鸟设计培训:Java多线程问题总结?

Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。

java课程培训机构认为这篇文章主要是对多线程的问题进行总结的,因此罗列了多个多线程的问题。

这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。

(1)发挥多核CPU的优势随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。

单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了。

多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。

(2)防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。

但是单核CPU我们还是要应用多线程,就是为了防止阻塞。

试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。

多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。

(3)便于建模这是另外一个没有这么明显的优点了。

假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。

但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。

北大青鸟java培训:java多线程编程中涉及的基础知识点?

线程设计在软件开发领域中是非常常见的一个设计构成,今天湖南北大青鸟就一起来了解一下,java多线程编程中都涉及到了哪些基础知识点。

顺序用于表示多个操作“依次处理”。

比如把十个操作交给一个人来处理时,这个人要一个一个地按顺序来处理并行用于标识多个操作“同时处理”。

比如十个操作分给两个人处理时,这两个人就会并行来处理。

并发相对于顺序和并行来说比较抽象,用于表示“将一个操作分割成多个部分并且允许无序处理”。

比如将十个操作分成相对独立的两类,这样便能够开始并发处理了。

如果一个人来处理,这个人就是顺序处理分开的并发操作,而如果是两个人,这两个人就可以并行处理同一个操作。

总结多线程程序都是并发处理的。

如果CPU只有一个,那么并发处理就是顺序执行的,而如果有多个CPU,那么并发处理就可能会并行运行。

等待队列所有实例都拥有一个等待队列,它是在实例的wait方法执行后停止操作的线程队列。

就好比为每个实例准备的线程休息室在执行wait方法后,线程便会暂停操作,进入等待队列这个休息室。

除非发生下列某一情况,否则线程会一直在等待队列中休眠。

有其他线程的notify方法来唤醒线程有其他线程的notifyAll方法来唤醒线程有其他线程的interrupt方法来唤醒线程wait方法超时notify方法该方法会将等待队列中的一个线程去除。

同wait方法一样,若要执行notify方法,线程也必须持有要调用的实例的锁。

notifyAll方法notify方法仅唤醒一个线程,而notifyAll则唤醒所有线程,这是两者之间的区别同wait方法和notify方法一样,notifyAll方法也只能由持有要调用的实例锁的线程调用notify和notifyAll选择notify方法和notifyAll方法非常相似,到底该使用哪个?实际上,这很难选择,由于notify唤醒的线程较少,所以处理速度要比使用notifyAll时快。

但使用notify时,如果处理不好,程序便可能会停止。

一般来说,使用notifyAll时的代码要比使用notify时的更为健壮。

关于Java多线程

分类: 电脑/网络 程序设计 其他编程语言

问题描述:

import java.awt.*;

import java.applet.*;

public class jex extends Applet implements Runnable

{

Thread th1=null;

String Message="Java now~";

Font f=new Font("TimesRoman",Font.BOLD,24);

int x,y;

public void init()

{

x=getSize().width;

y=getSize().height/2;

}

public void start()

{

if(th1==null)

{

th1=new Thread(this);

th1.start();

}

}

public void run()

{

while(true)

{

x=x-5;

if(x=0) x=getSize().width;

repaint();

try {th1.sleep(100);}

catch(InterruptedException e){}

}

}

public void paint(Graphics g)

{

g.setFont(f);

g.drawString(Message,x,y);

}

}

关于这程序中的几个细节:

while(true) true判断的是什么

th1=new Thread(this); this只什么,书上说是指定对象target的run()方法,不明白这句话--是说不明白this这个方法的作用和用处。

为什么把void start()里的东西放到paint里面不行或者是我做错了,我把 th1=new Thread(this);

th1.start();放到paint()里面后message飞速的动。

把init可不可以放到paint里去啊

init和start是不是thread的方法或者是什么?。

解析:

true是boolean类型的量,为恒真,所以while(true)是一个死循环,如果需要退出循环就要在while(true){}的大括号里加入break语句了。这里是为了循环的出现字符串“Java now~”。

this 是指这个类本身,也就是jex类,因为类Thread为构造方法里有Thread(Runnable r),而jex类本身实现了Runnable接口,所以th1 = new Thread(this)可以用来生一个成新的线程。

你写的这个类是Applet的子类,做为一个小应用程序都会的init(),start(),paint(),stop(), destroy()这些方法,如果没有写出,说明直接继承了父类Applet,这些方法都是不可缺少的。所以如果你把它们随便放的话,就会出现问题。

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

The End

发布于:2022-12-23,除非注明,否则均为首码项目网原创文章,转载请注明出处。