+ Start a Discussion
vijay bhaskarvijay bhaskar 

what is future method.

Hi Vijay ,

  1.Method which annoted with @Future annotation is called Future method .
  2.Future method  must be static , and can only return a void type.
  3.Parameters must be primitive data types, arrays of primitive data types, or collections of primitive data types but not sobject .
  4.You can not call a future method from other future method .
  5.Method like getContent and getContentAsPDFPageReference  
  6.Future method cannot call  methods  like getContent and getContentAsPDFPageReference .
  7.Future method will not execute with the order you called it may very based on the availability of resource .

Let me know if it helps .

Amit Chaudhary 8Amit Chaudhary 8
A future method runs in the background, asynchronously. You can call a future method for executing long-running operations, such ascallouts to external Web services or any operation you’d like to run in its own thread, on its own time. You can also make use of future methods to isolate DML operations on different sObject types to prevent the mixed DML error. Each future method is queued and executes when system resources become available. That way, the execution of your code doesn’t have to wait for the completion of a long-running operation. A benefit of using future methods is that some governor limits are higher, such as SOQL query limits and heap size limits

To define a future method, simply annotate it with the future annotation, as follows:-
global class FutureClass
    public static void myFutureMethod()
         // Perform some operations

1) Methods with the future annotation must be static methods
2) can only return a void type
3) The specified parameters must be primitive data types, arrays of primitive data types, or collections of primitive data types
4) Methods with the future annotation cannot take sObjects or objects as arguments.
5) You can invoke future methods the same way you invoke any other method. However, a future method can’t invoke another future method
6) No more than 50 method calls per Apex invocation
7) Asynchronous calls, such as @future or executeBatch, called in a startTest, stopTest block, do not count against your limits for the number of queued jobs
8) The maximum number of future method invocations per a 24-hour period is 250,000 or the number of user licenses in your organization multiplied by 200, whichever is greater
9) To test methods defined with the future annotation, call the class containing the method in a startTest(), stopTest() code block. All asynchronous calls made after the startTest method are collected by the system. When stopTest is executed, all asynchronous processes are run synchronously


Please mark this as solution if this will help you
Manoj Goswami 5Manoj Goswami 5
What is Future Method:

A future method runs in the background, asynchronously. You can call a future method for executing long-running operations, such as callouts to external Web services or any operation you'd like to run in its own thread, on its own time.

When to use Future Method:

If you want to make the execution of the apex program to run asynchronously then we make use of future method.When you specify
future , the method executes when Salesforce has available resources. For example, you can use the future annotation when making an asynchronous Web service callout to an external service.

Syntax  Rules :
1) Methods with the future annotation must be static methods (@future)
2) can only return a void type
3) The specified parameters must be primitive data types, arrays of primitive data types, or collections of primitive data types
4) Methods with the future annotation cannot take sObjects or objects as arguments.

Apex class with Future Method:
public class AccountProcessor 
  public static void countContacts(Set<id> setId) 
      List<Account> lstAccount = [select id,Number_of_Contacts__c , (select id from contacts ) from account where id in :setId ];
      for( Account acc : lstAccount )
          List<Contact> lstCont = acc.contacts ;
          acc.Number_of_Contacts__c = lstCont.size();
      update lstAccount;

Test class for the above:​
public class AccountProcessorTest {
    public static testmethod void TestAccountProcessorTest() 
        Account a = new Account();
        a.Name = 'Test Account';
        Insert a;

        Contact cont = New Contact();
        cont.FirstName ='Bob';
        cont.LastName ='Masters';
        cont.AccountId = a.Id;
        Insert cont;
        set<Id> setAccId = new Set<ID>();
        Account ACC = [select Number_of_Contacts__c from Account where id = :a.id LIMIT 1];
        System.assertEquals ( Integer.valueOf(ACC.Number_of_Contacts__c) ,1);

For more information refer to the below link.

Kindly mark my solution as the best answer if it helps you.

Best Regards,
Manoj Goswami