threadjava
Ⅰ java线程Thread报错
你这个问题是因为类加载顺序的问题导致的,出现这个问题的原因就是你使用了内部类,而在外面这个类的静态main方法里面你创建了内部类的实例所导致的,解决方法比较简单,在
classMyThreadextendsThread{}
在class前面加个static关键字就可以了
{}
具体原因的话是你可以这么理解,内部类就相当于外部类的一个属性像下面这种情况
classStudent{
privateStringname;
privateintage;
....
classCourse{
}
publicstaticvoidmain(String[]args){}
}
像上面这种情况,你就可以理解为Course这个类的用法跟name,age这些属性是一样的,只不过他还是一个类罢了。通过这个对比我们知道,在main中不能直接访问name,age等,因此也不能直接new Course这种情况。但是当我们在class前面加了static关键字之后,这种现象就打破了,Course就相当于一个普通的类了,只不过访问规则会有些不同罢了。
看着你还不采纳,我就心里发慌,是不是没说清楚,那我就详细说一下吧。
在内部类Couse里面的方法是可以直接访问外部类的name,age等这些属性的,是如何做到的呢,内部类里面在编译的时候是有一个指向外部类实例的引用的,这就要求要想创建内部类,就必须提前创建好外部类,否则这个指向外部类的实例的引用就没法赋值。根据这个结论,我们可以退出这种形式是可以的
classStudent{
privateStringname;
privateintage;
....
publicCoursegetCourse(){
returnnewCourse();
}
classCourse{
}
publicstaticvoidmain(String[]args){}
}
添加的getCouse()方法里面是可以直接new Course的,这是因为当你能执行一个类的普通方法的时候,这个类的实例就一定创建好了,所以这个时候内部类Course就可以获取到外部类的实例。
而在main方法中,没有创建外部类的实例,所以内部类也就没发直接new出来,但是可以通过先创建外部类,再创建内部类的这种形式。这个时候你的代码要稍微修改一下在创建MyThread的代码修改为如下的形式:
TestInterrupttest=newTestInterrupt();
MyThreadthread=test.new.MyThread();
这种形式看着很奇怪,但是当理解了原理就可以理解为什么要这么来写。
当然还有一种更简单的方法,那就是把你的内部类剪切到类的外面,就没有上面这些规则了,这个时候的类就相当于一个普通的类。
大体结构是这样的:
publicclassTestInterrupt{
....
}
//一定要放到大括号的外面,否则就是内部类了,要符合上面的要求
classMyThreadextendsThread{
....
}
Ⅱ Java中Runnable和Thread的区别是什么
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。
Ⅲ java中thread的start()和run()有何区别
1、start()方法来启动线程,真正实现了多线程运行,这时无需等待。
run方法体代码执行完毕而直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。
通过Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程。
2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码;
而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。
3、调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
4、这两个方法需要把并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。
(3)threadjava扩展阅读:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
Ⅳ java thread 使用
如果你是继承的Thread类,那么两种方式都可以,还可以直接Thread.sleep(),因为sleep是静态方法。如果是实现的Runnable接口就要用Thread.currentThread().sleep()这种方式。
Ⅳ Java中Runnable和Thread的区别
区别:Thread是类,而Runnable是接口。
抽象类和接口的区别如下:
① 在类来继承抽象类时,只需实现部分具体方法和全部抽象方法,而实现接口则要实现里面的全部方法。
②在接口中无成员变量,而抽象类中可有成员变量。
在Java中引进接口主要是为了解决多继承的问题。
实现多线程主要继承Thread 类和实现Runnable接口。
Ⅵ JAVA的Thread类的构造方法
Java的线程是通过java.lang.Thread类来实现的
构造方法:
Thread()
Thread(Runnable�0�2target)
参数:target 称为被创建线程的目标对象。创建目标对象target的类负责实现 Runnable接口,给出该接口中run()方法的方法体。
利用构造方法创建新线程对象后,进入线程的新建状态。
Ⅶ java里面的Thread类存在的意义是什么
Runnable是接口,只规定了run方法,本身不干活的。
你可以用任何方式实现Runnable,Thread类也是Runnable的一个具体实现,它的实现方式是启动一个新的线程,并执行run方法。
这样的设计Java里面到处都是,简直成为一个常态。
接口是抽象的一个体现,只抽象功能,并不理会具体属性和实现。
Ⅷ java中关于Thread的问题
import java.util.Date;
public class exe8_1
{
static Athread threadA;
static Bthread threadB;
public static void main(String args[])
{
threadA=new Athread();
threadB=new Bthread();
threadA.start();
threadB.start();
}
}
class Athread extends Thread
{
public void run()
{
for(int i=0;i<=3;i++)
{
Date TimeNow = new Date();//TimeNow要定义类型
System.out.println("A" + TimeNow.toString());//System要大写
try
{
sleep(2000);
}
catch(InterruptedException e)
{
}
}
}
}
class Bthread extends Thread
{
public void run()
{
for(int i=0;i<=5;i++)//int i要分开
{
Date TimeNow = new Date();//TimeNow要定义类型
System.out.println("B" + TimeNow.toString());//System要大写
try
{
sleep(1000);
}
catch(InterruptedException e)
{
}
}
}
}
Ⅸ java里thread怎么实现定时调度
java Thread类实现定时调度,可以延迟几秒之后再执行,代码如下:
publicclassceshi{
publicstaticvoidmain(String[]args)throwsException{
//runinasecond
finallongtimeInterval=1000;
Runnablerunnable=newRunnable(){
@Override
publicvoidrun(){
while(true){
//-------codefortasktorun
System.out.println("Hello!!");
//-------endshere
try{
Thread.sleep(timeInterval);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
};
Threadthread=newThread(runnable);//线程创建
thread.start();//线程启动
}
}
运行结果: