java多线程参数
Ⅰ java多线程中sleep方法中参数为负数和正数有什么区别
首先这个参数是必须>=0的,如果输入负数会抛出异常:
java.lang.IllegalArgumentException: timeout value is negative
再看看源码中这个方法的注释
* Causes the currently executing thread to sleep (temporarily cease
* execution) for the specified number of milliseconds, subject to
* the precision and accuracy of system timers and schelers. The thread
* does not lose ownership of any monitors.
大概翻译过来意思就是
当前线程休眠(暂时中止执行)指定数值(毫秒)的时长,当前线程仅仅是休眠,并不会释放临界资源锁(如果有的话)
Ⅱ 请问各为大神java多线程run函数调用递归函数怎么传参数
调用的地方,给一个参数
num(XXXXXXXXXXX);
这括号里面,加上一个整数的参数
Ⅲ java多线程开多少上限量。
1。java的线程开启,默认的虚拟机会分配1M的内存,但是在4G的windows上线程最多也就开到300多 ,是因为windows本身的一些限制导致。
2。虚拟机给每个线程分配的内存(栈空间)是由虚拟机参数-Xss来指定的,在不同平台上对应的默认大小可以 在oracle的官方文档上查询到:
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman /optionX.html
其中,Linux64位默认Xss值为256K,并非1M或10M
3。一个Java进程可以启动的线程数可以通过如下公式计算:
(系统剩余内存 - 最大堆容量Xmx - 最大方法区容量MaxPermSize)/ 最大栈空间Xss
这样,4G的服务器单个进程可以开多少线程,可以粗略计算出来,大概是5000个线程。
Ⅳ Java多线程是什么意思
Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
代码说明:
上述代码中Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads)
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheledExecutorService newScheledThreadPool(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
总结:ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。
Ⅳ java多线程方法有哪些
java实现线程常用到的方法有三种,供参考:
/**
*方法一:继承Thread类
*
*@authorqd
*
*/
{
@Override
publicvoidrun(){
System.out.println("run方法里面编写业务代码");
}
publicstaticvoidmain(String[]args){
MyThreadmyThread=newMyThread();
//调用start方法启动线程
myThread.start();
MyThread1myThread1=newMyThread1();
Threadthread=newThread(myThread1);
//调用start方法启动线程
thread.start();
}
}
/**
*方法二:实现Runnable接口
*
*@authorqd
*
*/
{
@Override
publicvoidrun(){
System.out.println("run方法里面编写业务代码");
}
}
/**
*方法三:实现Callable<T>接口优点:可以传参数,有返回值类型
*
*@authorqd
*
*/
<Integer>{
@Override
publicIntegercall()throwsException{
returnnull;
}
}
Ⅵ JAVA多线程有哪几种实现方式
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
[java]view plain
{
publicvoidrun(){
System.out.println("MyThread.run()");
}
}
- 在合适的地方启动线程如下:
MyThreadmyThread1=newMyThread();
MyThreadmyThread2=newMyThread();
myThread1.start();
myThread2.start();
- 2、实现Runnable接口方式实现多线程
- 如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
{
publicvoidrun(){
System.out.println("MyThread.run()");
}
}
- 为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:
MyThreadmyThread=newMyThread();
Threadthread=newThread(myThread);
thread.start();
- 事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:
publicvoidrun(){
if(target!=null){
target.run();
}
}
- 3、使用ExecutorService、Callable、Future实现有返回结果的多线程
- ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。
- 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。
[java]view plain
[java]view plain
[java]view plain
[java]view plain
Ⅶ java 多线程死循环怎么动态传参急!
用继承的方式实现Thread类,取名MyThread,在MyThread里面加一个属性 private Thread otherThread;并且给get,set方法.
在run方法里面的死循环中判断,if(otherThread!=null){取你要的参数};
这样一来,在new完thread1和thread2之后,调用thread2.setOtherThread(thread1);
然后再去start.
当然,还要给MyThread加一些属性存放你要传递的参数,在thread1的死循环里操作这些属性.
Ⅷ 高人 java多线程 synchronized() 括号里面的参数不同结果也不同 求解 下面是我写的代码
第一个锁用的this,this是一个指向对象的引用的关键字,所以你第一个锁实际是锁住了对A的引用,而程序中你创建了两个引用分别指向A的两个实例,所以锁没有生效
第二个锁直接锁住了类B,所以在实际程序调用中就会按照你锁的顺序进行
这样修改一下就能看出你锁住的是对A的一个实例的引用了
class ThreadTest extends Thread
{
B b;
public ThreadTest(B b){
this.b=b;
}
public void run(){
synchronized(this)
{
b.test();
System.out.println(getName()+"方法开始停止");
try
{
sleep(5000);
}
catch (Exception e)
{
}
System.out.println(getName()+"方法重新运行");
}
}
public static void main(String[] args)
{
B obj=new B();
ThreadTest obj1=new ThreadTest(obj);
// ThreadTest obj2=new ThreadTest(obj);
Thread a1 = new Thread(obj1);
Thread a2 = new Thread(obj1);
// Thread a2 = new Thread(obj2);
a1.start();
a2.start();
// obj1.start();
// obj2.start();
}
}
class B
{
public void test(){
System.out.println("我是B方法");
}
}
Ⅸ java里的关于多线程建立一个线程,建立一个对象,在线程类里面把对象做参数。
这要看你这两个线程使用是不是同一个对象,我写个例子,你仔细看一下
publicclassTest{
{
privateintflag=0;
publicMyThreads(){
}
@Override
publicvoidrun(){
System.out.println("flag="+(++flag));
}
}
publicTest(){
System.out.println("两条线程同用一个对象");
MyThreadsmyThread=newMyThreads();
newThread(myThread).start();
newThread(myThread).start();
}
publicTest(inti){
System.out.println("两条线程使用不同对象");
MyThreadsmyThread=newMyThreads();
newThread(myThread).start();
MyThreadsmyThread2=newMyThreads();
newThread(myThread2).start();
}
publicstaticvoidmain(String[]args){
Testt=newTest();
try{
//线程输出太快,先暂停一会
Thread.currentThread().sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
Testt2=newTest(1);
}
}
Ⅹ java 如何实现多线程
线程间的通信方式
同步
这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。
参考示例:
public class MyObject {
synchronized public void methodA() {
//do something....
}
synchronized public void methodB() {
//do some other thing
}
}
public class ThreadA extends Thread {
private MyObject object;
//省略构造方法
@Override
public void run() {
super.run();
object.methodA();
}
}
public class ThreadB extends Thread {
private MyObject object;
//省略构造方法
@Override
public void run() {
super.run();
object.methodB();
}
}
public class Run {
public static void main(String[] args) {
MyObject object = new MyObject();
//线程A与线程B 持有的是同一个对象:object
ThreadA a = new ThreadA(object);
ThreadB b = new ThreadB(object);
a.start();
b.start();
}
}
由于线程A和线程B持有同一个MyObject类的对象object,尽管这两个线程需要调用不同的方法,但是它们是同步执行的,比如:线程B需要等待线程A执行完了methodA()方法之后,它才能执行methodB()方法。这样,线程A和线程B就实现了 通信。
这种方式,本质上就是“共享内存”式的通信。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。