多线程小结

一、多线程的创建和启动

1、继承至Thread类,重写run方法

public class ThreadDemo extends Thread {
	public void run(){
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+"..."+i);
		}
	}
}
public class ThreadMain {

	public static void main(String[] args) {
		ThreadDemo td1=new ThreadDemo();
		ThreadDemo td2=new ThreadDemo();

		td1.start();
		td2.start();

	}
}

2、实现Runnable接口

public class ThreadDemo implements Runnable {
	public void run(){
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+"..."+i);
		}
	}
}
public class ThreadMain {

	public static void main(String[] args) {
		ThreadDemo td=new ThreadDemo();
		Thread t1=new Thread(td);
		Thread t2=new Thread(td);
		t1.start();
		t2.start();
	}
}

注意:多线程的是通过start()方法来启动,start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态,什么时候运行是由操作系统决定的。

二、线程的状态

  1. 新建状态(New):新创建了一个线程对象。
  2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
  4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
    (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
    (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
    (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

三、线程同步

1.同步方法

即有synchronized关键字修饰的方法。

由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,

内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

	public synchronized void Test(){
		System.out.println("这是同步方法");
	}

2.同步代码块

即有synchronized关键字修饰的语句块。

被该关键字修饰的语句块会自动被加上内置锁,从而实现同步

	public void Test(){
		synchronized (object) {
			System.out.println("这是同步代码块");
		}
	}

3、死锁

产生死锁的条件:

  1. 有至少一个资源不能共享
  2. 至少有一个任务必须持有一个资源并且等待获取另一个被别的任务持有的资源
  3. 资源不能任务抢占
  4. 必须有循环等待
public class Lock {
	Object locka="a";
	Object lockb="b";
}
public class DeadLockTest implements Runnable{
	Lock lock=new Lock();
	boolean flag;
	public DeadLockTest(boolean flag){
		this.flag=flag;
	}
	public void run() {
		if(flag){
			while(true)
			synchronized (lock.locka) {
				System.out.println(Thread.currentThread().getName()+"getlocka");
				synchronized (lock.lockb) {
					System.out.println(Thread.currentThread().getName()+"getlockb");
				}
			}
		}else{
			while(true)
			synchronized (lock.lockb) {
				System.out.println(Thread.currentThread().getName()+"getlockb");
				synchronized (lock.locka) {
					System.out.println(Thread.currentThread().getName()+"getlocka");
				}
			}
		}
	}
}
public class DeadLockMain {

	public static void main(String[] args) {
		DeadLockTest dt1=new DeadLockTest(true);
		DeadLockTest dt2=new DeadLockTest(false);

		Thread t1=new Thread(dt1);
		Thread t2=new Thread(dt2);

		t1.start();
		t2.start();
	}

}
时间: 2024-10-08 22:08:03

多线程小结的相关文章

黑马程序员___多线程小结

----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- 进程和线程 进程是正在进行中的程序,指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程. Java程序的进程里有几个线程:主线程, 垃圾回收线程(后台线程) 线程是指进程中的一个执行任务(控制单元),一个进程中可以运行多个线程,多个线程可共享数据.多线程:在同一个进程中同时运行的多个任务;一个进程至少有一个线程,为了提高效率,可以在一个进程中

【Java基础】Java多线程小结

在说多线程之前,首先要清楚为啥要提出多线程,这就要明白线程和进程间的区别了. 线程和进程间的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程,同一个进程中

java多线程小结,及解决应用挂死的问题

这两天为了定位JBOSS老是挂死的问题,学习了一下JAVA多线程方面的知识,在此总结一下 1.在Java程序中,JVM负责线程的调度.线程调度是指按照特定的机制为多个线程分配CPU的使用权. 调度的模式有两种:分时调度和抢占式调度.分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间:抢占式调度是根据线程的优先级别来获取CPU的使用权.JVM的线程调度模式采用了抢占式模式. 2.Thread类实际上也是实现了Runnable接口的类. 在启动的多线程的时候,需要先通过Thr

【转】C#绝对新手之C#中的多线程小结

大概有4种方法: Dispatcher.异步委托.手动多线程.BackgroundWorker,另外还有一个DispatcherTimer,是定时器. 其中Dispatcher与DispatcherTimer相同,是利用在主线程进行任务优先级的排列来模拟多线程,因此其中实质是单线程 ,所以大负荷的运算不宜用它们.在异步调用的时候,使用Dispatcher.Invoke(addItem, image); BackgroundWorker会到线程池去抓一个线程作为工作线程,完成工作后切换回 UI 线

Java多线程小结

JAVA实现多线程的方式有两种,继承Thread,实现Runnable, 但在JDK1.5之后又有一种新的方式:实现Callable<V>接口 package Test2016.demo; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.c

Android 多线程小结

1.启动欢迎界面 1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 // TODO Auto-generated method stub 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.welcome); 6 new Handler().postDelayed(r, 1000);// 1秒后关闭,并跳转到主页面 7 } 8 9 R

多线程小结(1)

原文出处 定义就不多说了,直接上代码 1 /// <summary> 2 /// 单线程应用 3 /// </summary> 4 class Program 5 { 6 static void Main(string[] args) 7 { 8 Console.WriteLine("进入主线程"); 9 User u = new User("小刚"); 10 u.Getshow(); 11 Console.WriteLine("主

ios 多线程小结----- GCD篇

//3 GCD(充分利用设备的多盒)-------------屏蔽了线程,只能看见任务 队列步骤两步,定制任务,将任务添加到队列.GCD将添加的任务,放到线程中去执行,自动执行,自动释放原则:先进先出,先添加的任务先执行,有别于栈的先进后出,先添加的任务后执行 -------GCD--- GCD有两个用来执行任务的函数:同步函数,异步函数同步:按顺序执行任务,同一条线程执行(不开线程)异步:同时执行任务(开启新线程) 同步,异步,并发,串行同步:当前线程执行,不具备开启新线程的能力异步:在新线程

关于多线程小结

在查找资料和学习的过程中留下的一点总结,敬请拍砖指教. 程序.进程.线程的区别? 进程是一个程序的进行时状态,一个程序运行在不同的数据集上可以形成多个进程.线程是进程的一个运行单元,一个进程中可以有多个线程. volatile 和 synchronized 区别 volatile 是变量修饰符,使线程不拷贝主内存中的变量而是直接操作主内存中的变量,从而保持变量的一致性,但是volatile在变量的值依赖于它的前一个值时会失效. synchornized 修饰方法或代码块,使得整个代码块获得监视器