sleep() 和Thread.sleep()疑惑,请大家指点!

iweitao 2009-07-28 08:49:38

public class ThreadTest2 implements Runnable{
public void run(){
System.out.println("My thread2 is running...");
}

public static void main(String[] args) {

//把Runnable接口的实现类作为参数,构造Thread对象。
Thread t=new Thread(new ThreadTest2());
t.start();

try{
Thread.sleep(3000); //sleep()为Thread类的静态方法
}catch(InterruptedException e){
e.printStackTrace();
}

//返回当前线程的字符串表示形式
String str=Thread.currentThread().toString();
System.out.println(str);
System.out.println("Main thread is running...");
}
}

-------------------------------------------------------
上边一段代码中,sleep()方法必须用Thread调用,这我能理解,
但是为什么其他类里只用sleep()不报错,这里只用sleep()就报错呢?
原因在哪里呢?

...全文
662 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaomsds 2012-08-17
  • 打赏
  • 举报
回复
一楼正解哈。。。。。。。。。。。
andycpp 2009-07-29
  • 打赏
  • 举报
回复
学习了
jiang5495 2009-07-29
  • 打赏
  • 举报
回复
study
lovecj6185 2009-07-29
  • 打赏
  • 举报
回复
1L right
q956140151 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hweitao123 的回复:]
引用 7 楼 sunjzb 的回复:
public class ThreadTest2 implements Runnable{
  public void run(){
  System.out.println("My thread2 is running...");
}
因为你这是实现Runnable接口,而这个接口里只有run()这一个方法,(不信的话,可以去JAVA API里去查就可以了),所以它这里是不能直接用sleep()的;


class MyThread extends Thread{
int i=0;   
public void run(){                   
while(true){
System.out.println("==="+i++);
try{
sleep(1000);
}catch(InterruptedException e){
return;
}
}
}
}
而这个方法是直接继承的Thread类,因为Thread类里有sleep(),所以可以直接sleep();


众所周知Thread类是属于lang包的,而lang包是不用导入就有的,所以在此情况下就可以直接用Thread.sleep(); 而不能用sleep(),因为这里没有继承Thread类,如下例:
public class Test5 {
public static void main(String[] args) {
String s1 = new String("aaa"),s2 = new String("bbb");
try {
Thread.sleep(4000);
} catch (InterruptedException e)
e.printStackTrace();
}
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}
睡眠4秒后,就会输出结果了

谢谢大家的回答
我的意思是在继承Thread类中可以直接使用sleep()方法,
不过你说到其他的类中必须使用Thread.sleep()也对。

我只是想了解为什么是这样,既然已经了解了,
个人感觉以后不管在哪里还是用Thread.sleep()比较好,静态方法。

给你提点建议,敬请斟酌:
String s1 = new String("aaa"),s2 = new String("bbb");
好像这样写的很少,应该简洁些:
String s1="aaa";
String s2="bbb";

还有System.out.println(s1.toString());
可以直接写:
System.out.println(s1);
因为toString()中参数如果是字符串,还是返回本身,有点多余

我学习Java时间也不是很长,共同探讨。哈哈。。。


[/Quote]
String s1="aaa";和String s1 = new String("aaa")是不一样的,这里有一个串池的概念。
tyqp183zcm 2009-07-29
  • 打赏
  • 举报
回复
sunjzb 2009-07-29
  • 打赏
  • 举报
回复
呵呵,
学习
iweitao 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sunjzb 的回复:]
public class ThreadTest2 implements Runnable{
  public void run(){
  System.out.println("My thread2 is running...");
}
因为你这是实现Runnable接口,而这个接口里只有run()这一个方法,(不信的话,可以去JAVA API里去查就可以了),所以它这里是不能直接用sleep()的;


class MyThread extends Thread{
int i=0;   
public void run(){                   
while(true){
System.out.println("==="+i++);
try{
sleep(1000);
}catch(InterruptedException e){
return;
}
}
}
}
而这个方法是直接继承的Thread类,因为Thread类里有sleep(),所以可以直接sleep();


众所周知Thread类是属于lang包的,而lang包是不用导入就有的,所以在此情况下就可以直接用Thread.sleep(); 而不能用sleep(),因为这里没有继承Thread类,如下例:
public class Test5 {
public static void main(String[] args) {
String s1 = new String("aaa"),s2 = new String("bbb");
try {
Thread.sleep(4000);
} catch (InterruptedException e)
e.printStackTrace();
}
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}
睡眠4秒后,就会输出结果了
[/Quote]
谢谢大家的回答
我的意思是在继承Thread类中可以直接使用sleep()方法,
不过你说到其他的类中必须使用Thread.sleep()也对。

我只是想了解为什么是这样,既然已经了解了,
个人感觉以后不管在哪里还是用Thread.sleep()比较好,静态方法。

给你提点建议,敬请斟酌:
String s1 = new String("aaa"),s2 = new String("bbb");
好像这样写的很少,应该简洁些:
String s1="aaa";
String s2="bbb";

还有System.out.println(s1.toString());
可以直接写:
System.out.println(s1);
因为toString()中参数如果是字符串,还是返回本身,有点多余

我学习Java时间也不是很长,共同探讨。哈哈。。。

yqfly2008 2009-07-29
  • 打赏
  • 举报
回复
赞同一楼
iweitao 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xblue3 的回复:]
Thread().sleep()是静态方法吧.
[/Quote]
sleep()是静态方法,调用时用其类名直接调用,好像不用小括号,
应该是 Thread.sleep()
actor_3348 2009-07-28
  • 打赏
  • 举报
回复
学习了
zuoguodang 2009-07-28
  • 打赏
  • 举报
回复
1楼说的对
sunjzb 2009-07-28
  • 打赏
  • 举报
回复
public class ThreadTest2 implements Runnable{
public void run(){
System.out.println("My thread2 is running...");
}
因为你这是实现Runnable接口,而这个接口里只有run()这一个方法,(不信的话,可以去JAVA API里去查就可以了),所以它这里是不能直接用sleep()的;


class MyThread extends Thread{
int i=0;
public void run(){
while(true){
System.out.println("==="+i++);
try{
sleep(1000);
}catch(InterruptedException e){
return;
}
}
}
}
而这个方法是直接继承的Thread类,因为Thread类里有sleep(),所以可以直接sleep();


众所周知Thread类是属于lang包的,而lang包是不用导入就有的,所以在此情况下就可以直接用Thread.sleep(); 而不能用sleep(),因为这里没有继承Thread类,如下例:
public class Test5 {
public static void main(String[] args) {
String s1 = new String("aaa"),s2 = new String("bbb");
try {
Thread.sleep(4000);
} catch (InterruptedException e)
e.printStackTrace();
}
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}
睡眠4秒后,就会输出结果了
zl3450341 2009-07-28
  • 打赏
  • 举报
回复
学习了
Landor2004 2009-07-28
  • 打赏
  • 举报
回复
Thread.sleep中的Thread表示的就是当前线程。
meadking 2009-07-28
  • 打赏
  • 举报
回复
Thread().sleep()是静态方法吧.
dreamhunter_lan 2009-07-28
  • 打赏
  • 举报
回复
哪里直接就sleep()的,要么是new Thread().sleep(),要么是Thread.sleep(),除非是在Thread类的源代码中才会有直接写sleep(),这些其实都是小问题,LZ可以想想为什么sleep()要设计成静态方法吧??(如果不是静态方法会有意义吗??)
superheizai 2009-07-28
  • 打赏
  • 举报
回复
一楼正解!
gesanri 2009-07-28
  • 打赏
  • 举报
回复
因为你这是实现Runnable接口,Runnable接口里没有sleep()方法,如果你是继承Thread类,就可以直接只用sleep()了,因为Thread类里有sleep()方法
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java多线程    已有Java开发基础,想要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧