程序就是一堆指令集。
进程是运行中的程序,是程序在自身地址空间中的一次执行活动,是程序独立运行的基本单位。
线程是轻量级的进程,是程序执行中的一条执行路径。
如何创建进程
第一种:继承Thread类,重写run方法:
class="java" name="code">
public class ThreadTest extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i= 0; i<1000 ;i++){
System.out.println(i);
}
}
}
public class Test {
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
//使用静态代理来实现
new Thread(threadTest).start();
for(int j=0; j<1000; j++){
System.out.println("zhongwen");
}
}
}
第二种:实现runable
接口,实现run方法
public class ThreadTest02 implements Runnable {
@Override
public void run() {
for(int i= 0; i<1000 ;i++){
System.out.println(i);
}
}
}
public class Test {
public static void main(String[] args) {
ThreadTest02 threadTest02 = new ThreadTest02();
//使用静态代理来实现
new Thread(threadTest02).start();
for(int j=0; j<1000; j++){
System.out.println("zhongwen");
}
}
}
通过实现runable接口的方法可以避免java单继承的
尴尬,但是,它也不完美,因为不能声明
异常。此时可考虑callable方法。
第三种:实现callable接口,重写call方法。
实际上,要玩并发,还需要深入了解其他的类知识。
---------------------------------------------------------------------------------
关于线程的优先级:
java默认是“先到先服务”,而一般线程默认优先级为5,总范围1~10,越大优先级越高。
可以通过setPriority和getPriority获取和设置线程的优先级;
还有三个常量:MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
----------------------------------------------------------------------------
线程的常见方法:
join() 合并线程,会造成原线程阻塞,等加进去的线程结束以后回到就绪状态
-------------------------------------------------------------------------------
线程的安全问题:
可以使用
同步,他的两个前提,首先要有两个以上的线程,其次多个线程用的同一个锁。
同步解决并发问题的根本原因在于那个对象,该对象如同锁的功能。
格式:
synchronize(对象){
需要同步的代码;
}
同步方法分为静态同步方法和非静态同步方法;
所有的非静态同步方法都用同一把锁----实例对象本身
所有的静态同步方法都用同一把锁----类对象本身
在同步中调用同步需要小心,容易发
生死锁。
死锁:就是两个或者多个线程无休止地等待对方释放所占据的资源。