多线程
来源:互联网 发布:怎么提取软件源码 编辑:程序博客网 时间:2024/06/01 22:30
/*
* 线程:
*
* 线程的好处:解决了在一个进程中同时可以执行多个任务代码的问题。
*
* 自定义线程创建方式:
* 方式一:继承Thread.
* 1.自定义一个类继承Thread类。
* 2.重写Thread的run方法。把自定义线程的任务代码自定义run方法上。
* 3.创建Thread子类的对象,并且Start方法启动一个线程。
public class demo1 extends Thread{
publicdemo1(String name){
super(name);
}
@Override
publicvoid run(){
for(inti=0;i<100;i++){
//Thread.currentThread()得到的就是当前thread对象
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
publicstatic void main(String[] args){
demo1 d=new demo1("狗娃");
//开启一个线程
d.start();
for(inti=0;i<100;i++){
//Thread.currentThread()得到的就是当前thread对象
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
*方式二:实现Runnable接口
* 1.自定义一个类实现Runnable接口
* 2.实现Runnable接口中run方法,把自定义线程的任务代码自定义run方法上。
* 3.创建Runnable实现类的对象。
* 4.创建thread对象。并且把Runnable实现类作为参数传递。
* 5.调用Thread对象Start方法启动线程。
*
* 线程安全出现的原因:
* 1.必须要存在两个或两个以上的线程共享的一个资源。
* 2.操作共享资源的代码必须有两句或者两句以上。
*
*
* 线程安全问题的解决方案:
* 1.同步代码块。
* synchronized(锁){
* 需要被同步的代码!
* }
* class Bank{
private int sum;
public void add(int n){
sum+=n;
System.out.println("sum="+sum);
}
}
class Cus implementsRunnable{
private Bank b=new Bank();
public void run(){
synchronized(b){
for(int x=0;x<3;x++)
{
b.add(100);
}
}
}
}
public class demo1{
publicstatic void main(String[] args){
Cus c=new Cus();
Thread t1=new Thread(c);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
*
* 2.同步函数。
*
* 修饰符synchronized返回值类型 函数名(形参列表..){
*
*
*
* }
*
*
*注意:1.同步代码块的锁可以是任意的对象。 同步函数的锁是固定的,非静态函数的所对象是this对象。静态函数的锁对象是class对象。
* 2.锁对象必须是多线程共享对象。否则锁不住。
* 3.在同步代码块或者是同步函数中用Sleep方法是不会释放锁对象的,如果是调用了wait方法,会释放锁对象。
*
*/
packagecom.tgb.thread;
class Bank{
private int sum;
public synchronized void add(int n){
Object obj=new Object();
sum+=n;
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("sum="+sum);
}
}
class Cus implementsRunnable{
private Bank b=new Bank();
public void run(){
for(int x=0;x<3;x++)
{
b.add(100);
}
}
}
public class demo1{
publicstatic void main(String[] args){
Cus c=new Cus();
Thread t1=new Thread(c);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}