新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
package threadgroup;
创新互联建站主要从事成都网站设计、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务樊城,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
class ThreadDemo3 extends Thread {
private String name;
private int delay;
public ThreadDemo3(String sname, int i_delay) {
name = sname;
delay = i_delay;
}
public void run() {
try {
sleep(delay);
} catch (InterruptedException e) {
}
System.out.println("多线程测试!\n" + name + "\n" + delay);
}
}
public class testMyThread {
public static void main(String[] args) {
ThreadDemo3 th1,th2,th3;
th1 = new ThreadDemo3("线程1", (int) (Math.random() * 900));
th2 = new ThreadDemo3("线程2", (int) (Math.random() * 900));
th3 = new ThreadDemo3("线程3", (int) (Math.random() * 900));
th1.start();
th2.start();
th3.start();
}
}
package threadgroup;
public class threadDemo {
public static void main(String[] args) {
Thread t = Thread.currentThread();
t.setName("你好吗?");
System.out.println("正在进行的Thread是:" + t);
try {
for (int i = 0; i 5; i++) {
System.out.println("我不叫穆继超" + i);
Thread.sleep(3000);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("Thread has wrong" + e.getMessage());
}
}
}
package threadgroup;
public class threadDemo2 implements Runnable {
public threadDemo2() {
Thread t1 = Thread.currentThread();
t1.setName("第一个主进程");
System.out.println("正在运行" + t1);
Thread t2 = new Thread(this, "");
System.out.println("在创建一个进程");
t2.start();
try {
System.out.println("使他进入第一个睡眠状态");
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第一个进程");
}
public void run() {
try {
for (int i = 0; i 5; i++) {
System.out.println("进程" + i);
Thread.sleep(3000);
}
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第二个进程");
}
public static void main(String[] args) {
new threadDemo2();
}
}
线程用到Thread或者Runnable接口(Thread也操作了Runnable接口)
继承了Thread类后需要重载其run方法,在方法里写你需要完成的事情,开始线程是调用其start方法。
操作Runnable接口必须实现其run方法,在方法里写你需要完成的事情,Runnable接口没有start方法,所以启动线程还是需要依靠Thread类 new Thread(Runnable runnable).start();
一般项目中多是操作接口,因为类只能单继承,接口可以操作多个。
首先,你同步的是具体的某个Test实例, 对于那个实例来说,实际上只有一个线程访问了那个代码块,但是sum和other却是多个线程同时去进行访问,实际上这是不安全的,如果你想实现每次都输出10000的效果,那么正确的应该是在Test.class上加锁,而不是获取Test实例的锁,修改后的代码如下:
public class Test extends Thread {
public static int sum = 10000;
public static int other = 0;
public void getMoney() {
synchronized (Test.class) {
System.out.println(Thread.currentThread().getName() + " 开始执行");
sum = sum - 100;
System.out.println("sum-100");
other = other + 100;
System.out.println("other+100");
System.out.println(sum + other);
System.out.println(Thread.currentThread().getName() + " 执行完成");
}
}
public void run() {
getMoney();
}
public static void main(String[] agrs) {
Thread t[] = new Thread[10];
for (int i = 0; i = 9; i++) {
t[i] = new Test();
t[i].start();
}
}
}
// 上面代码能得到你的结果
这段代码的功能是显示各个时区当前时钟。
TimerListener是一个接口,有一个timeElapsed方法,目的是根据当前的时间绘制时钟,并刷新显示。
Timer继承Thread类,实现了run方法。run方法中,休眠指定的时间,并调用TimerListener的timeElapsed方法。如上例就是每休眠1S调用一次,所以看到的结果就是每1S绘制的时钟会更新一次。
ClockCanvas继承JPanel并实现了TimerListener接口,在构造方法中,根据指定的时区得到calendar实例。并开启线程Timer。
重写了paintComponent方法,在该方法中,首先绘制了一个圆,然后分别绘制时针、分针和秒针。
时针颜色为红色,分针为黄色,秒针为蓝色。在时钟下面绘制了城市,颜色为黑色。
是特殊的线程,一般用于在后台为其他线程提供服务.
isDaemon():判断一个线程是否为守护线程.
set Daemon():设置一个线程为守护线程.
Thread类和Runnable接口
Thread类
类Thread在包java.lang中定义,它的构造方法如下:
public Thread();
public Thread(Runnable target);
public Thread(Runnable target,String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group, String name);
主要方法
isActive() 判断是否处于执行状态
Suspend() 暂停执行
reSume 恢复执行
start() 开始执行
Stop() 停止执行
sleep() 睡眠
run() 程序体
yield() 向其他线程退让运行权
线程优先级
Public statuc final int MAX_PRIORITY最高优先级,10
Public statuc final int MIN_PRIORITY最低优先级,1
Public statuc final int NORM_PRIORITY普通优先级,5
Runnable接口
Runnable接口中只定义了一个方法run()作为线程体,
void run()
Java的线程是通过java.lang.Thread类来实现的。
VM启动时会有一个由主方法(public static void main(){})所定义的线程。
可以通过创建Thread的实例来创建新的线程。
每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。
通过调用Thread类的start()方法来启动一个线程
Java里面实现多线程,有2个方法
1 继承 Thread类,比如
class MyThread extends Thread {
public void run() {
// 这里写上线程的内容
}
public static void main(String[] args) {
// 使用这个方法启动一个线程
new MyThread().start();
}
}
2 实现 Runnable接口
class MyThread implements Runnable{
public void run() {
// 这里写上线程的内容
}
public static void main(String[] args) {
// 使用这个方法启动一个线程
new Thread(new MyThread()).start();
}
}
一般鼓励使用第二种方法,应为Java里面只允许单一继承,但允许实现多个接口。第二个方法更加灵活。