Thread的Sleep方法详解,

/*
1.Thread.sleep(毫秒)
2.sleep方法是一个静态方法
3.该方法的作用:阻塞该线程,让给其他线程
*/
public class fuck4 {
public static void main(String[] args) throws InterruptedException{
Thread t1=new professor();
t1.setName("t1");
t1.start();

//阻塞主线程
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"-->"+i);
Thread.sleep(500);
}
}

}

class professor extends Thread{
//Thread中的run方法不抛出异常,所以重写run方法后,在run方法的声明位置上不能使用throw
//必须使用try catch
public void run(){
for(int i=0;i<50;i++){
System.out.println(Thread.currentThread().getName()+"-->"+i);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
//m1();
}
//public static void m1 throws Exception(){}//m1可以抛出异常

}


/*
面试题
*/
public class fuck5 {
public static void main(String[] args) throws InterruptedException{
//创建线程
Thread t=new processor();
t.setName("t");

//启动线程
t.start();

//休眠
t.sleep(5000);//等同于Thread.sleep(5000).阻塞的还是当前线程,和t线程无关
System.out.println("hello java");

A a=null;
a.m1();//不会报空指针异常,空指针异常是指空指针指向对象,m1为静态方法,不是对象
}

}


class processor extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}


class A{
public static void m1(){}

}

/*
某线程正在休眠,如何打断它的休眠

以下方法依靠的是异常处理机制
*/
public class fuck6{
public static void main(String[] args) throws InterruptedException{
Thread t=new Thread(new processor());
t.setName("t");
t.start();

//5s之后终止
Thread.sleep(5000);

//打断t的休眠
t.interrupt();

}
}
class processor implements Runnable{
public void run(){
try{
Thread.sleep(1000000);
System.out.println("heetian");}
catch(InterruptedException e){
e.printStackTrace();}

  for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}

}

/*
如何正确更好的终止一个正在执行的线程

需求:线程启动5s之后终止
*/
public class fuck7{
public static void main(String[] args) throws InterruptedException{

processor p=new processor();
Thread t=new Thread(p);

t.setName("t");
t.start();

//5s之后终止
Thread.sleep(5000);

//终止
p.run=false; 
//因为线程是同时运行的,主线程和t线程同时运行,主线程5秒后run变成false,
//这时t线程刚好输出五个数,但已经不满足run=true条件,所以就终止了,究极原因是线程是同时运行的
}
}


class processor implements Runnable{
boolean run=true;

public void run(){

for(int i=0;i<10;i++){
if(run){
try{Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+"--->"+i);}
else{
return;}

}
}
}

<think>我们注意到用户要求获取Java中Thread类的"call"方法的详细解释。然而,根据提供的引用和Java标准库,Thread类并没有一个名为"call"的方法。在Java中,与线程执行相关的方法通常是"run"(定义线程执行的任务)和"start"(启动线程)。而"call"方法通常与Callable接口相关联,该接口类似于Runnable,但可以返回结果和抛出异常。 因此,我们需要澄清:Thread类本身没有call方法。如果用户指的是Callable接口的call方法,那么我们可以进行解释。否则,可能是用户记错了方法名。 根据引用[1]、[2]、[3]、[4]、[5]的内容,其中没有提到Thread类有call方法。引用[5]中提到了Thread类的start方法和run方法,以及一个私有的本地方法start0。 因此,我们将分两种情况: 1. 如果用户确实指的是Thread类的某个方法,那么可能是用户记错了,我们需要指出Thread类没有call方法,并引导用户了解run方法或start方法。 2. 如果用户指的是Callable接口的call方法,那么我们就解释Callable接口的call方法。 由于用户的问题明确提到“Thread类的call方法”,而Thread类确实没有这个方法,所以我们需要先指出这一点,然后推测用户可能指的是Callable接口的call方法,并给出解释。 另外,我们也可以考虑用户可能将Thread类和FutureTask等一起使用时遇到的call方法,但归根结底call方法属于Callable接口。 因此,回答结构如下: 1. 指出Thread类没有call方法。 2. 介绍Callable接口的call方法。 3. 说明如何使用Callable和FutureTask来创建线程(因为Thread只能接受Runnable,而FutureTask实现了RunnableFuture,它继承自Runnable和Future,可以包装Callable)。 同时,我们将生成相关问题。 注意:需要参考的引用中并没有直接关于Callable的内容,所以我们只基于标准Java知识进行解释。但引用[3]提到了使用lambda表达式创建线程,而Callable同样可以使用lambda表达式。 下面进行回答: </think> ### Java Thread类中的`call`方法解析 在Java标准库中,**Thread类本身并没有名为`call`的方法**。这一混淆可能源于以下两种情况: --- ### 1. **常见误解:`call`与`run`方法的混淆** - Thread类的核心方法是`run()`和`start()`: - **`run()`**:定义线程执行的任务逻辑(需重写或通过Runnable实现)。 - **`start()`**:启动线程并触发`run()`方法的执行(JVM底层调用`start0()`本地方法[^5])。 - **错误示例**: ```java Thread t = new Thread(() -> { // 此处是run()的内容,非call() }); t.start(); // 正确启动线程 ``` --- ### 2. **实际存在的`call`方法:`Callable`接口** Java中真正的`call()`方法属于**`java.util.concurrent.Callable<V>`接口**(非Thread类)。与Runnable不同,`Callable`支持返回值并允许抛出异常: #### 关键特性: - **返回值**:通过泛型指定返回类型(如`Callable<Integer>`)。 - **异常处理**:可抛出受检异常(`Runnable`的`run()`不能)。 - **使用流程**: 1. 实现`Callable`接口并重写`call()`。 2. 通过`FutureTask`包装`Callable`。 3. 将`FutureTask`传递给Thread执行(因Thread只接受`Runnable`)。 #### 代码示例: ```java import java.util.concurrent.*; public class CallableDemo { public static void main(String[] args) throws Exception { // 1. 创建Callable任务 Callable<Integer> task = () -> { System.out.println("计算中..."); Thread.sleep(1000); return 123; // 返回结果 }; // 2. 用FutureTask包装Callable FutureTask<Integer> futureTask = new FutureTask<>(task); // 3. 创建线程并启动 Thread t = new Thread(futureTask); t.start(); // 4. 获取结果(阻塞等待计算完成) Integer result = futureTask.get(); System.out.println("结果: " + result); } } ``` - **输出**: ``` 计算中... 结果: 123 ``` --- ### 对比总结 | 特性 | `Runnable` | `Callable` | |--------------------|--------------------------|---------------------------| | **方法名** | `run()` | `call()` | | **返回值** | `void` | 泛型类型(如`Integer`) | | **异常抛出** | ❌ 不允许受检异常 | ✅ 允许抛出受检异常 | | **使用场景** | 简单异步任务 | 需返回结果或异常处理的任务 | > ⚠️ 注意:若直接调用`call()`而非通过线程调度,它仅是普通方法调用,不会启动新线程。 --- ### 相关问题 1. `Callable`与`Runnable`接口的主要区别是什么? 2. 如何使用`FutureTask`获取异步任务的执行结果? 3. Java中如何处理线程执行过程中抛出的异常? 4. 线程池(如`ExecutorService`)如何提交`Callable`任务? [^1]: Thread类及常见方法【Java】 [^2]: Java 线程Thread类中的方法 [^3]: 使用lambda表达式创建线程 [^4]: Thread类的方法使用 [^5]: JAVA线程之Thread详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值