线程和进程:每一个java程序都是一个进程,每个进程都有自己独特的资源(即内存空间),进程之间资源不共享,所有进程都是同步操作的,进程可能需要同时进行多个操作,每一个操作可以看成一个线程,线程之间资源共享,每一个线程都是进程的组成部分,所有的线程都可以共享进程的资源。
主线程:main方法开启主线程,是不需要我们创建的线程,主线程分配的资源最多,也是用来响应用户操作的。
一般我们创建的线程都是子线程,
(子)线程的创建:
第一种方法:1.创建一个类继承Thread类型
2.复写run方法
3.在主线程处创建一个子线程的对象,来调用start方法
4.Thread.sleep(1000);进行时间间隔限制,1000表示线程每执行一次操作就暂停1秒钟。
第二种方法:1.创建一个类实现Runable方法
2.复写run方法,添加线程内容
3.启动线程
每个线程都有自己的唯一id,在线程创建的时候就被分配好的,线程运行的次序是高度不可控的线程可以使用类的属性方法
一个简单的线程调用实例:
public class MyThread extends Thread{//继承Thread方法
private static int ticket = 23;
private Object obj;
public MyThreads(String name,Object obj) {
super(name);
this.obj=obj;
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
synchronized (obj){
if(ticket<23){
return;
}
System.out.println(Thread.currentThread().getName()+ticket --);
}
}
}
}
public class MyThread1 implements Runable{//实现Runable接口
private static int ticket = 23;
@Override
public void run() {
while(true){
fun();
}
}
public synchronized void fun(){
if(ticket<0){
return;
}
System.out.println(ticket--);
}
}
调用:
public static void main(){
MyThread m=new MyThread
new Thread(m).start();
Object obj1 = new Object();
MyThreads ms1 = new MyThreads("1号:",obj1);
ms1.start();
}
synchronized关键字,实现同步锁机制,一般修饰方法,类,代码块,其作用的范围是大括号{}括起来的部分,作用对象是调用该部分的对象,
一个线程访问一个对象中的synchronized代码块时,其他试图访问该对象的线程将被阻塞,也就是说,当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块,两个线程互斥,只有当一个线程执行完毕,释放资源解锁之后,另一个线程才能执行并锁定该对象。