问题是这样的。 我现了一个线程,但是run函数里就调用了一个 别的函数。
例如public void run() {
XXXClass.longTimeExecute();
}而这个函数会花上点时间, 问题我想做2个功能,一个就是让这个函数暂停 一个是挂起。
另外这个函数的源代码是不能改的。
所以不能像一下参考贴里的那样,自己加wait或者Thread.sleep。
可行吗?
参考贴
例如public void run() {
XXXClass.longTimeExecute();
}而这个函数会花上点时间, 问题我想做2个功能,一个就是让这个函数暂停 一个是挂起。
另外这个函数的源代码是不能改的。
所以不能像一下参考贴里的那样,自己加wait或者Thread.sleep。
可行吗?
参考贴
1.你这个函数如果不是线程的话,怎莫让函数暂停呢?
再说了,暂停是针对整个线程而言的,不是针对方法而言2.退一步说,即便真的要挂起线程
楼上的各位也说了用 suspend
建议这个方法不要用,会造成线程的死锁,现在这个方法已经成为Thread类里不推荐使用方法了所以,要解决楼主的需求
大概只能是暂时执行这个方法的线程,或者设为后台线程
而不是让方法暂停
你想让run函数里面的函数暂停 除非它里面有线程 不然你是不能停掉里面的函数的
一旦夯实在线程合法是被调用了 他就会一直执行下去(就是普通函数) 虽然CPU不可能一口气
运行玩 但CPU迟早到要运行玩
就概念来函数不同于线程 是无法暂停的
那你弄错了。Java语言中执行的主体是线程(实际上所有的面向对象多线程程序都是这样的),函数(方法)是静态的,而且都是成员函数,只有它被所属的对象调用所调用才可能被执行,哪个线程执行了调用语句,该函数的执行过程就从属于该线程的执行。而线程一旦暂停或者终止,则函数的执行也随之暂停或者终止。在Java多线程程序设计中,被执行的总是线程,或者是主线程(main函数的执行),或者是自定义线程(使用Thtread类创建的),函数是一个静态的东西,它只能被某个线程所执行,不可能自己执行。我想引起你误解的地方大概是:你所考虑的函数被调用是在main函数中的,那它的执行当然和其他用户创建的线程无关了,但是,它实际上是从属于主线程的,你同样可以在该函数中加上Thread.sleep()语句,此时,当主线程调用该函数时,执行到Thread.sleep()语句,主线程同样会暂停。
知道是不是这样class Person
{
// 两种情况
private String name = "AAAA" ;
private String content = "作者" ;
public synchronized void setName(String name,String content)
{
this.name=name;
try{
Thread.sleep(100);
}catch(Exception e)
{
}
this.content=content;
}
public synchronized String getName()
{
return this.name+" --> "+this.content;
}
};
class Pro implements Runnable
{
private Person per = null ;
public Pro(Person per)
{
this.per = per ;
}
public void run()
{
for(int i=0;i<100;i++)
{
if(i%2==0)
{
per.setName( "BBBBB","老板") ;
}
else
{
per.setName( "AAAA","作者") ;
}
}
}
};class Cust implements Runnable
{
private Person per = null ;
public Cust(Person per)
{
this.per = per ;
}
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println(per.getName()) ;
}
}
};public class ThreadDemo19
{
public static void main(String args[])
{
Person per = new Person() ;
Pro p = new Pro(per) ;
Cust c = new Cust(per) ; new Thread(p).start() ;
new Thread(c).start() ;
}
};
国内现在两种人才在贬值。
1是驾驶员,以前我们学习驾驶一年才能拿到本,现在15天就拿到了,结果路上一大批马路杀手。
2是程度员,以前100个高中生只出5个本科学,5个本科生中0.2个是做计算机,0.08个是定程序的,现在100
个高中生,70上本科生,20个专科生。70个本科生中40个做计算机的,15个写程序的。结果就是39个回贴中30个以上在胡说。
不要骂我说话刻薄,认真想一想这是不是事实。
挂起,一般都是指线程的挂起,没听说过函数能挂起的。
这里面有一个问题,需要区别一下。就是,函数可以被多个线程来执行。
所以,楼主说的挂起函数,应该是指挂起执行函数的线程。
如果是多个线程都要执行这个函数,那么,是挂起所有调用这个函数的线程,
还是只挂起第一个调用该函数的线程 ?暂停,这个词,貌似没有在编程里面接触过,最早是在使用磁带录音机的时候接触到的。
线程的状态里面,好像和暂停最贴近的,应该就是挂起状态,其次是阻塞状态吧。楼主说的2个功能(暂停、挂起),想了很久,也没想清楚到底是什么意思。如果我们想中断某个函数的执行过程,可以通过挂起调用该函数的线程的方式来进行。
(多线程调用同一函数时,情况可能会非常恶劣)
当然,在程序中想要挂起某个线程,最好是new一个Monitor线程来完成这件事情,
当然,异步操作某个函数的执行进度,会使程序具有不可控性,严重的情况下,会产生死锁。
不知道你是如何理解的?我前面明明一再强调,函数不是执行的主体,线程才是执行的主体,Java程序中可能有很多线程在运行,其中一个是主线程,就是执行main函数的线程,其余的是程序中使用Thread类创建的线程(其实严格地说,还有我们看不到也不必关心的系统自定义的后台线程)。我说的“线程是执行的主体”指是任意线程,不论主线程还是自定义线程。
这么简单的问题竟然有这么多白痴在不懂装懂。还什么代理什么拦截。一个函数a(){
s1;
s2;
................
sn;
}放在一个线程的run方法中,假如线和叫t,t.start()后。
假如执行到 s9,你调用t.sleep();
当然是停止执行这个函数了。你想控制函数本身也没法控制,而正好你要的就是不修改函数本身,你只要控制
那个run 方法所在的线程。这种问题对程序员来说就是幼儿园小班的问题,竟然有这么多不懂装懂的在故作高深。
Java这么强大的
public static void main(String[] args) {
Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get
Producer p=new Producer (q);//让new出的p去往q里面put
Customer c=new Customer (q);//让new出的c从q中get
p.start();//p和q开始的顺序并不报错
c.start();
}
}
class Producer extends Thread
{
Queue q;
public Producer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的put方法
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
q.put(i);//此处只是让q去put 10次
System.out.println("Producer put "+i);//并且输出本次放的是第几杯
}
}
}
class Customer extends Thread
{
Queue q;
public Customer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的get方法
}
@Override
public void run() {
while (true) {//死循环:只要q里面有,就去get
//get方法有返回值,返回值就是producer所put的数量
//此处也不需要去考虑是第几杯
//在Queue中的value解决可这一问题:
//put中的I赋给value,get方法有返回值就value的值
System.out.println("Customer get "+q.get());
//如果循环完了,就跳出循环,否则线程不会自己结束
if (q.value==9) {
break;
}
}
}
}
class Queue
{
int value;
boolean bFull=false;
public synchronized void put (int i)//在producer中的put方法中就是将其I传进来
{
if (!bFull) {//条件为真(如果没满,就倒水)
value=i;//给value赋值,现在有几杯水
bFull=true;//满了
notify();//唤醒其他线程(让customer去get)
}
try {
wait();//告诉customer去get后自己等待customer的get结束
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized int get()
{
if (!bFull) {//如果没满就等待,如果满了就不进 **这就是为什么main里面谁先开始不报错的原因**
//get和put方法中的if条件判断起到了至关重要的作用
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
bFull =false;//赋值为没满
notify();//唤醒producer去put
return value;//get的返回值就是put的时候给value赋的值
}
}
程序是什么,就是一段表示要执行的逻辑。
线程是什么?就是进程中细化的轻量级进程,对于讨论这个问题本身,我们可以把线程当做进程看。管你什么函数,循环还是流线性逻辑,都是要CPU按这个逻辑执行的指令流。
要控制什么进修执行哪一个指令当然是控制当遇到什么指令时当前执行这段指令流的进程。一个函数执行后不会因为线程挂起或暂住而挂起或暂停?这种话会把你的任课老师气死的。
连1+1都没弄懂,还学什么编程?让函数执行的是谁,函数在哪里执行的?执行函数的线程都停了,竟然说函数不会停。函数
在你的梦里执行的啊?我们进程(线程在本主题中可以认为相同)运行好比飞机飞行,我们乘客就是这次飞行的函数。
要控制人停下来怎么办?当然是控制某种条件下飞机停下来。难道飞机停下来你还在飞?上面有兄弟说“某人说话虽然刻薄,但............”.
是的我说得有些刻薄,但这是最最基础的1+1都不明白,还故作高深讨论别的。我这叫刻薄吗?
我这叫愤怒!