导航:首页 > 方法技巧 > java主方法如何获取线程数据

java主方法如何获取线程数据

发布时间:2022-11-25 01:46:26

A. Java中如何实现父线程如何获得子线程数据

建立一个类
继承Thread或者Runnable接口就自己看着办了
然后在run方法法里面
while(true)
{
××××××
//写上重画的代码

Thread.sleep(1000);

}

B. java 如何获得线程池中正在执行的线程数

java中线程池的监控可以检测到正在执行的线程数。
通过线程池提供的参数进行监控。线程池里有一些属性在监控线程池的时候可以使用
taskCount:线程池需要执行的任务数量。
completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。
largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。
getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不+
getActiveCount:获取活动的线程数。
通过扩展线程池进行监控。通过继承线程池并重写线程池的beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等。这几个方法在线程池里是空方法。如:
protected
void
beforeExecute(Thread
t,
Runnable
r)
{
}

C. 急求:java 如何获得线程运算的结果

在main方法中创建一个数组。
所有线程类的构造方法都需要一个数组做参数。线程体结束时给数组中的某个元素赋值。
public void run() {
......
a[i] = ......;
}
main方法中等待所有线程结束后打印数组。
t1.join();

D. java获得当前线程有两种方法,第一种是Thread.currentThread();谁知道另外一种

另外一种是实现Runnable接口,implements Runnable
这种方法有两个好处是
(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。
(2)可以避免由于Java的单继承特性带来的局限。经常碰到这样一种情况,即当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。

E. Java回调以及如何获取线程的执行结果

软件模块之间存在调用的接口,从调用方式来看,有同步调用、回调、异步调用这三种方式:

Java回调的必须要素:
1.雇主类必须有可以被观察者调用的方法A;
2.观察者必须持有可以调用A的对象的引用。

在实际工作中,我们通常将方法A以interface或者内部类的形式来实现,然后把包含有A的类的对象引用传递到观察者中。

Java中的线程的返回值是void,并且是一个异步执行流,所以我们没有直接的方法来获取线程执行后的结果,即不能直接知道线程何时结束,以及合适去获取线程执行任务后的结果。由于回调的存在,我们可以在线程中以回调的方式通知线程的调用者线程的结束时间,并可以将任务的结果通过回调回送到调用者中。

F. java怎么在线程里面获取数据

import java.io.*;
class DownThread extends Thread {
//定义字节数组(取水的竹筒)的长度
private final int BUFF_LEN = 32;
//定义读取的起始点
private long start;
//定义读取的结束点
private long end;
//读取文件对应的输入流
private InputStream is;
//将读取到的字节输出到raf中
private RandomAccessFile raf;

//构造器,传入输入流,输出流和读取起始点、结束点
public DownThread(long start, long end, InputStream is, RandomAccessFile raf) {
//输出该线程负责读取的字节位置
System.out.println(start + "---->" + end);
this.start = start;
this.end = end;
this.is = is;
this.raf = raf;
}

public void run() {
try {
is.skip(start);
raf.seek(start);
//定义读取输入流内容的的缓存数组(竹筒)
byte[] buff = new byte[BUFF_LEN];
//本线程负责读取文件的大小
long contentLen = end - start;
//定义最多需要读取几次就可以完成本线程的读取
long times = contentLen / BUFF_LEN + 4;
//实际读取的字节数
int hasRead = 0;
for (int i = 0; i < times; i++) {
hasRead = is.read(buff);
//如果读取的字节数小于0,则退出循环!
if (hasRead < 0) {
break;
}
raf.write(buff, 0, hasRead);
}
} catch (Exception ex) {
ex.printStackTrace();
}
//使用finally块来关闭当前线程的输入流、输出流
finally {
try {
if (is != null) {
is.close();
}
if (raf != null) {
raf.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}

public class MutilDown {
public static void main(String[] args) {
final int DOWN_THREAD_NUM = 4;
final String OUT_FILE_NAME = "d:/勇敢的心.rmvb";
InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];
RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];
try {

isArr[0] = new FileInputStream("d:/勇敢的心.rmvb");
long fileLen = getFileLength(new File("d:/勇敢的心.rmvb"));
System.out.println("文件的大小" + fileLen);
//以输出文件名创建第一个RandomAccessFile输出流
outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");
//创建一个与文件相同大小的空文件
for (int i = 0; i < fileLen; i++) {
outArr[0].write(0);
}
//每线程应该读取的字节数
long numPerThred = fileLen / DOWN_THREAD_NUM;
//整个文件整除后剩下的余数
long left = fileLen % DOWN_THREAD_NUM;
for (int i = 0; i < DOWN_THREAD_NUM; i++) {
//为每个线程打开一个输入流、一个RandomAccessFile对象,
//让每个线程分别负责读取文件的不同部分。
if (i != 0) {

isArr[i] = new FileInputStream("d:/勇敢的心.rmvb");
//以指定输出文件创建多个RandomAccessFile对象
outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");
}
if (i == DOWN_THREAD_NUM - 1) {
//最后一个线程读取指定numPerThred+left个字节
new DownThread(i * numPerThred, (i + 1) * numPerThred
+ left, isArr[i], outArr[i]).start();
} else {
//每个线程负责读取一定的numPerThred个字节
new DownThread(i * numPerThred, (i + 1) * numPerThred,
isArr[i], outArr[i]).start();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

public static long getFileLength(File file) {
long length = 0;
//获取文件的长度
long size = file.length();
length = size;
return length;
}
}

G. java 如何获取一个线程中的变量

你把他设置为私有的,当然获取不了了,可以修改为public或者为该对象增加get,set方法

H. 怎样获取java线程中信息

? 在进行多线程编程中,比较重要也是比较困难的一个操作就是如何获取线程中的信息。大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中,然后再提供一个获取方法将这个字段的内容返回给该方法的调用者。如以下的ReturnThreadInfo类:package threadtest1;/**** @author shi mingxiang*/public class ReturnThreadInfo extends Thread { private String str; public ReturnThreadInfo() { this.str = "Hello";}public void run(){ this.str = "Hello World!";}public String getThreadInfo(){ return this.str;}} 大家可以看到该类是一个线程类并含有一个初始值为"Hello"的字段str以及一个可以返回str值的方法:getThreadInfo(),而且当这个线程启动后str会被赋于新值:"Hello World!"。现在我想在另外一个类中启动ReturnThreadInfo线程,并通过getThreadInfo()方法获取值为"Hello World!"的变量并打印输出到控制台中。以下给出一个实现该功能的Main类:package threadtest1;/**** @author shi mingxiang*/public class Main{ public Main() {}/*** @param args the command line arguments*/public static void main(String[] args) { ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo(); returnThreadInfo.start(); //创建并启动ReturnThreadInfo线程 System.out.println(returnThreadInfo.getThreadInfo()); //获取并输出returnThreadInfo对象的str的值}} 以上是一个多数熟悉单线程编程的人在第一反应下给出的实现方法。但是该类在运行的时候输出的结果却不是期望的"Hello World!"而是"Hello",这是由于线程的竞争条件导致的(由于ReturnThreadInfo线程和Main线程的优先级都为5,所以在很大几率上ReturnThreadInfo线程的run()方法还没有运行,Main类就已经运行System.out.println(returnThreadInfo.getThreadInfo());将"Hello"输出了。具体的原理可以参见另一篇文章:"java多线程的几点误区")。有的人可能会立即想到把ReturnThreadInfo线程的优先级设高些(比如最大的10)就可以returnThreadInfo线程的run()方法先运行完,然后Main类的System.out.println(returnThreadInfo.getThreadInfo())再运行,这样输出的结就一定是期望的"Hello World!"了。这种通过调整线程优先级的方法固然可以在某种程度上解决该问题,但是线程争用CPU运行时间的原理却决不仅仅只是优先级高低的原因(优先级高的线程并不意味着一定比优先级低的线程先运行,只是几率要更大一些)。你并不希望ReturnThreadInfo线程9999次都比Main先运行,却在最关键的一次在Main之后再运行。因此下面给出两种比较常见的获取线程信息的方法: 一、轮询 比较常见的一种解决方案是,让线程类获取方法在结果字段设置之前返回一个标志值。然后主线程定时询问获取方法,看是否返回了标志之外的值。以下给出了具体的实现方法,该方法不断测试str的值是否为"Hello",如果不为"Hello"才打印输出它。例如:package threadtest1;/**** @author shi mingxiang*/public class Main{ public Main() {}/*** @param args the command line arguments*/public static void main(String[] args) { ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo(); returnThreadInfo.start(); //创建并启动ReturnThreadInfo线程 while(true){ String str = returnThreadInfo.getThreadInfo(); if(!str.equals("Hello")){ System.out.println(returnThreadInfo.getThreadInfo());break;}}}} 二、回调 轮询方法最大的特点是主类Main不断询问线程类是否结束,这实际上大量浪费了运行时间,特别是当线程特别多的时候。因此如果反过来在线程结束时,由线程自己告诉主类Main线程已经结束,然后Main再获取并输出str的值,这样就避免了轮询方法所带来的不必要的系统开销问题。 在具体的实现过程中,线程可以在结束时通过调用主类中的一个方法来实现告知功能,这种方法叫做回调。这样主类Main就可以在等待线程结束时休息,也就不会占用运行线程的时间。下面是修改后的Main类:public class Main{ public Main() {}/*** @param args the command line arguments*/public static void main(String[] args) { // TODO code application logic here ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo(); returnThreadInfo.start();}public static void receiveStr(String str){ System.out.println(str);}} 相比于前面,我们在Main类中添加了一个静态方法receiveStr(String str),该方法是供线程结束之前调用,通过参数str将要返回的线程信息返回给Main类并输出显示出来。下面是修改后的ReturnThreadInfo类,该类在线程结束前回调了Main.receiveStr方法,通知线程已结束。package threadtest1;/**** @author shi mingxiang*/public class ReturnThreadInfo extends Thread { private String str; public ReturnThreadInfo() { this.str = "Hello";}public void run(){ Main.receiveStr(str); //回调receiveStr方法}} 如果有很多个对象关心线程的返回的信息,线程可以保存一个回调对象列表。某个对象可以通过已经定义的一个对象将自己添加到列表中,表示自己对这些信息的关注。如果有多个类的实例关心这些信息,也可以定义一个interface,在interface中声名回调方法,然后这些类都实现这个接口。其实这是典型的java处理事件的方法,这么做可以使得回调更灵活,可以处理涉及更多线程、对象和类的情况。稍后会给出这种模仿事件处理模型的回调的实现方法。 这种方案虽然能起到作用,但是它做了大量不需要做的工作。

I. java 线程中的run()方法无返回值并且不停止,如何得到线程数据

可以让线程实现Callable接口,实现call方法,可以把你需要的东西return回去,然后如果是线程池的话可以用Future对象的get()方法来接收这个返回值。但是这样做线程池也只会同步执行一个线程。

J. java 获取线程实例

主线程直接或间接引用要销毁线程的实例,后然调用要销毁线程interrupt()方法中断线程执行。
你的说意思我知道,但是让别人去管理还不如让自己管理线程销毁,然后提供一个外部接口,让别一条消息就可以中断线程呢?Sun jdk documentation就是这样建议的。具体你可以查看以下文章:
http://..com/question/149156342.html

阅读全文

与java主方法如何获取线程数据相关的资料

热点内容
杜兰特真正的训练方法 浏览:317
网上买床安装方法 浏览:782
奶奶教裁剪方法简单好用 浏览:449
老人机短信中心在哪里设置方法 浏览:855
化肥中氮的含量检测方法视频 浏览:77
照片如何加水印方法 浏览:534
有点打呼噜有什么好方法 浏览:406
如何赏析诗句方法公式 浏览:725
快速融化冰块的方法 浏览:131
手臂痛怎么治疗方法 浏览:486
days360函数的使用方法 浏览:633
治疗湿尤有效方法 浏览:913
小米的快捷键设置在哪里设置方法 浏览:773
用底线思维方法解决问题 浏览:282
检测方法elisa法 浏览:196
远离口臭的最佳治疗方法 浏览:688
中药及其制剂常用的纯化方法 浏览:153
充电机使用方法步骤12V 浏览:1003
正确怀孕的方法 浏览:52
iphone6跳屏解决方法 浏览:897