/* 编写3个线程分别实现各自运行时间,第一个线程每隔1秒运行一次,第二每隔5秒第三个每隔10秒 */
classSZimplementsRunnable{privateintx,m;Threadt1,t2,t3;publicvoidgetName(){t1=newThre...
class SZ implements Runnable
{
private int x,m;
Thread t1,t2,t3;
public void getName()
{
t1=new Thread();
t1.setName("线程1");
t2=new Thread();
t2.setName("线程3");
t3=new Thread();
t3.setName("线程3");
}
public void getDate()
{
if(Thread.currentThread()==t1)m=1000;
if(Thread.currentThread()==t2)m=5000;
if(Thread.currentThread()==t3)m=10000;
}
public synchronized void run()
{try
{
while(x<100)
{
getDate();
getName();
System.out.println(Thread.currentThread()+"线程已经运行");
x++;Thread.sleep(m);
}}
catch(Exception e)
{
}
}
}
class Clock3
{
public static void main(String[] args)
{
SZ s=new SZ();
s.t1.start();
s.t2.start();
s.t3.start();
}
}//错误是Exception in thread "main" java.lang.NullPointerException at Clock3.ma(Clock3.java:41) 展开
{
private int x,m;
Thread t1,t2,t3;
public void getName()
{
t1=new Thread();
t1.setName("线程1");
t2=new Thread();
t2.setName("线程3");
t3=new Thread();
t3.setName("线程3");
}
public void getDate()
{
if(Thread.currentThread()==t1)m=1000;
if(Thread.currentThread()==t2)m=5000;
if(Thread.currentThread()==t3)m=10000;
}
public synchronized void run()
{try
{
while(x<100)
{
getDate();
getName();
System.out.println(Thread.currentThread()+"线程已经运行");
x++;Thread.sleep(m);
}}
catch(Exception e)
{
}
}
}
class Clock3
{
public static void main(String[] args)
{
SZ s=new SZ();
s.t1.start();
s.t2.start();
s.t3.start();
}
}//错误是Exception in thread "main" java.lang.NullPointerException at Clock3.ma(Clock3.java:41) 展开
1个回答
展开全部
首先,要实现线程类有两种方法。一种就是实现接口,就想你上面的SZ这个类。另一种就是继承Thread类。你直接new一个Thread严格来说也没错误。你的错误我给你写几条:
1、main方法里s没有调用start()方法,自然s.t1也就没有被实例化。
2、即使改正了第1,也可能先执行s.t1.start(),而不是s.start()所以s.t1仍然没被实例化,调用它的start()自然也错误。
最后,为了满足你的要求我给你写了个简单的,相信你能看懂,其实没你想象的那么复杂,如下:
class Clock3
{
public static void main(String[] args)
{
new MyThread("线程1",1000).start();
new MyThread("线程2",5000).start();
new MyThread("线程3",10000).start();
}
}
class MyThread extends Thread {
private long m = 0;
MyThread(String name, long m) {
super(name);
this.m = m;
}
@Override
public void run() {
// TODO Auto-generated method stub
int x = 0;
try
{
while(x<100)
{
System.out.println(Thread.currentThread().getName()+"线程已经运行");
x++;Thread.sleep(m);
}}
catch(Exception e)
{
}
}
}
我测试过了,没问题!
1、main方法里s没有调用start()方法,自然s.t1也就没有被实例化。
2、即使改正了第1,也可能先执行s.t1.start(),而不是s.start()所以s.t1仍然没被实例化,调用它的start()自然也错误。
最后,为了满足你的要求我给你写了个简单的,相信你能看懂,其实没你想象的那么复杂,如下:
class Clock3
{
public static void main(String[] args)
{
new MyThread("线程1",1000).start();
new MyThread("线程2",5000).start();
new MyThread("线程3",10000).start();
}
}
class MyThread extends Thread {
private long m = 0;
MyThread(String name, long m) {
super(name);
this.m = m;
}
@Override
public void run() {
// TODO Auto-generated method stub
int x = 0;
try
{
while(x<100)
{
System.out.println(Thread.currentThread().getName()+"线程已经运行");
x++;Thread.sleep(m);
}}
catch(Exception e)
{
}
}
}
我测试过了,没问题!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询