`

java线程

 
阅读更多

1.线程的创建:(两种方法)
    1)继承Thread类,重写里面的run方法,将要运行的代码放在run方法中
    2)实现Runnalble接口,实现里面的run方法,将线程要运行的程序放在run方法中,
创建Thread线程,将Runnable对象作为参数传递给Thread对象,调用Thread对象的start方法,使Runnable中的run方法运行:如:
package com.itcast.day10;

/**
 * 创建一个类实现Runnable接口
 * @author Yxx
 *
 */
class Cyte implements Runnable{
	private int i=100;
	public void run() {
		while(true){
			if(i>0){
				System.out.println(Thread.currentThread().getName()+"------"+i--);
			}
		}
	}
}

/**
 * 
 * @author Yxx
 *
 */
public class ThreadDemo {
	public static void main(String[] args) {
		//创建一个Runable实例
		Cyte c = new Cyte();
		//创建线程将Runnable接口实例作为参数传给Thread构造函数
		Thread t = new Thread(c);
		Thread t1 = new Thread(c);
		Thread t2 = new Thread(c);
		Thread t3 = new Thread(c);
		Thread t4 = new Thread(c);
		//将线程启动
		t.start();
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}




2.线程的几种状态


1.被创建:当用new关键字创建一个线程实例,但还没有调用start方法
2.运行:线程调度程序将处于就绪状态的线程置为当前线程时,线程为允许状态,开始执行run方法中的代码
3.就绪状态:当线程调用了start方法之后线程进入了就绪状态,等待着线程调度程序将线程置为当前线程,线程才会处于运行状态。
4.阻塞:当程序正在运行状态,调用了wait方法或者sleep方法时,程序处于阻塞状态,当程序调用notify方法时,程序才会被唤醒,但不一定马上进入运行状态,而是在就绪状态等待
5.死亡:当一个线程中的run方法里面的程序执行完成,或者调用了stop方法,程序就会处于死亡状态,对于已经死亡的线程,无法再调用start使他进入就绪状态
代码同步
对于多个线程访问同一个共享资源,有时候会出现数据共享的错误,原因就是因为cpu的调度不是人为能控制,当cpu在执行完if判断之后,当前线程处于阻塞状态,而cpu去执行其他权限更高的程序,cpu会在当前执行处记住一个地址,等cpu执行完其他程序,它就会更据那个地址继续向前执行,在执行过程中可能i的值已经到了1,而现在又不用判断,所以就出现了0,-1的现象
3.代码同步
对于多个线程访问同一个共享资源,有时候会出现数据共享的错误,原因就是因为cpu的调度不是人为能控制,当cpu在执行完if判断之后,当前线程处于阻塞状态,而cpu去执行其他权限更高的程序,cpu会在当前执行处记住一个地址,等cpu执行完其他程序,它就会更据那个地址继续向前执行,在执行过程中可能i的值已经到了1,而现在又不用判断,所以就出现了0,-1的现象
class Cyte implements Runnable{
	private int i=100;
	public void run() {
		while(true){
			if(i>0){
				try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}	System.out.println(Thread.currentThread().getName()+"------"+i--);
			}
		}
	}
}



如果需要对操作共享资源的代码块添加代码同步。如:
class Cyte implements Runnable{
	private int i=100;
	Object o = new Object();
	public void run() {
		while(true){
			synchronized (o) {
				if(i>0){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"------"+i--);
				}
			}
		}
	}
}


  • 大小: 32.8 KB
  • 大小: 27.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics